2011-04-11 52 views
4

我想在验证URL的C++ {MFC}中构建一个正则表达式。CPP +正则表达式验证URL

正则表达式必须满足以下条件。

有效网址: - http://cu-241.dell-tech.co.in/MyWebSite/ISAPIWEBSITE/Denypage.aspx/ http://www.google.com http://www.google.co.in

无效网址: -

  1. http://cu-241.dell-tech.co.in/ \ MyWebSite/\ ISAPIWEBSITE/\ Denypage.aspx/= Regx必须检查&无效网址为“/\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 =正则表达式必须检查&无效的URL用于额外插入%5C &%2F字符。

我们该如何开发一个满足上述条件的通用正则表达式。 请帮助我们提供一个正则表达式,将处理CPP {MFC}中的上述场景

回答

0

请看http://gskinner.com/RegExr/,右侧有一个社区选项卡,您可以在其中找到提供的正则表达式。有一个URI类别,不知道你会准确找到你需要的东西,但这是一个好的开始

9

您是否尝试过使用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

这是工作真的很棒。你能告诉我如何使用这个来提取字符串中的所有匹配的URL使用正则表达式吗?我试图用它与sregex_iterator一起使用,但我没有得到任何匹配。非常感谢你! – Julius 2016-02-28 10:31:28

+2

Unforutnately这不是为了验证,而是为了将正确的URI分解成它的部分。它甚至不会检测最简单的情况,如未编码的空格。 – Lothar 2016-07-27 03:27:38

+0

感谢这样一个有用的和解释良好的答案。这是我发现的准确性,易用性和快速实施的最佳全方位网址分析脚本。而且你不需要下载任何特殊的库!这将对这个问题做出很好的回答:https://stackoverflow.com/q/2616011/1043704 – 2017-09-30 03:19:42