CPP + регулярное выражение для проверки URL - PullRequest
5 голосов
/ 11 апреля 2011

Я хочу построить регулярное выражение в c ++ {MFC}, который проверяет URL.

Регулярное выражение должно удовлетворять следующим условиям.

Действительный URL: - http://cu-241.dell-tech.co.in/MyWebSite/ISAPIWEBSITE/Denypage.aspx/ http://www.google.com http://www.google.co.in

Неверный URL: -

  1. http://cu -241.dell-tech.co.in / \ MyWebSite / \ ISAPIWEBSITE / \ Denypage.aspx / = Regx должен проверить & недопустимый URL-адрес как символ '\' между "/ \ MyWebSite / \ISAPIWEBSITE / \ Denypage.aspx / "

  2. http://cu -241.dell-tech.co.in ////// MyWebSite / ISAPIWEBSITE / Denypage.aspx / = Regx должен проверить и сделать недействительным URL-адрес из-за нескольких записей "///////" в URL.

  3. http://news.google.co.in/%5Cnwshp?hl=en&tab=wn = Regex должен проверить &сделать недействительным URL-адрес для дополнительной вставки символа% 5C и% 2F.

Как мы можем разработать общее регулярное выражение, удовлетворяющее указанному выше условию.Пожалуйста, помогите нам, предоставив регулярное выражение, которое будет обрабатывать описанные выше сценарии в CPP {MFC}

Ответы [ 2 ]

9 голосов
/ 24 июля 2015

Вы пытались использовать предложение RFC 3986 ? Если вы способны использовать GCC-4.9, вы можете перейти непосредственно с <regex>.

В нем говорится, что с ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))? вы можете получить в виде подсовпадений:

  scheme    = $2
  authority = $4
  path      = $5
  query     = $7
  fragment  = $9

Например:

int main(int argc, char *argv[])
{
  std::string url (argv[1]);
  unsigned counter = 0;

  std::regex url_regex (
    R"(^(([^:\/?#]+):)?(//([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?)",
    std::regex::extended
  );
  std::smatch url_match_result;

  std::cout << "Checking: " << url << std::endl;

  if (std::regex_match(url, url_match_result, url_regex)) {
    for (const auto& res : url_match_result) {
      std::cout << counter++ << ": " << res << std::endl;
    }
  } else {
    std::cerr << "Malformed url." << std::endl;
  }

  return EXIT_SUCCESS;
}

Тогда:

./url-matcher http://localhost.com/path\?hue\=br\#cool

Checking: http://localhost.com/path?hue=br#cool
0: http://localhost.com/path?hue=br#cool
1: http:
2: http
3: //localhost.com
4: localhost.com
5: /path
6: ?hue=br
7: hue=br
8: #cool
9: cool
0 голосов
/ 11 апреля 2011

посмотрите на http://gskinner.com/RegExr/, справа есть вкладка сообщества, где вы найдете добавленные регулярные выражения.Есть категория URI, не уверен, что вы найдете именно то, что вам нужно, но это хорошее начало

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...