【问题标题】:parse ipv6 address from url从 url 解析 ipv6 地址
【发布时间】:2014-02-22 00:15:08
【问题描述】:

我正在使用 VC++ 并尝试从收到的 url 解析 ip (ipv4/ipv6) 地址。有什么办法可以做到这一点。我知道一种方法是遍历 url 中的每个字符并在 ipv6 的 url 中查找 [ 和 ]。这似乎不是一个好方法,所以想知道是否有任何函数可以帮助我从 URL 中提取 IP 地址?

例如,我的网址如下所示,

http://[fe80::222:bdff:fef5:56a4]:80/index.html?version=1.0&id=1

【问题讨论】:

  • 使用正则表达式?
  • 我认为 Regex 将帮助我确认输入的 ipv4/ipv6 是否有效。如何使用正则表达式解析/提取 ipv4/ipv6?
  • 您可以使用捕获组来提取IP。任何体面的正则表达式库都支持捕获组。

标签: c visual-c++ ipv6 ipv4


【解决方案1】:

由于您使用 标记了问题,我建议您使用wininet 库中的InternetCrackUrl() 进行解析。

【讨论】:

    【解决方案2】:

    来自 url 解析器的一些代码。正则表达式是多余的。

        // Look for IPv6
        if( s[domain_start] == '[' ) {
            pos = s.find(']', domain_start);
            if (pos != string::npos && pos < domain_end && s[pos+1] == ':')
                ++pos;
            else
                pos = string::npos;
        } else {
            pos = s.find(':', domain_start);
        }
    

    但是,如果你喜欢正则表达式,这里有一个来自 Perl URL 破解器的:

    my ($protocol, $domain, $port, $path, $query, $fragment) = $url =~
        m!
            ^([^:/]*://)?
            ((?:\[[^]]*]) | (?:[^:/\\\#?]*))
            (:\d+)?
            (/[^?#]*)?
            (\?[^#]*)?
            (\#.*)?
        !x;
    

    将其转换为 C++ 正则表达式库应该很简单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-15
      • 2012-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-02
      • 1970-01-01
      • 2013-02-28
      相关资源
      最近更新 更多