разобрать адрес ipv6 из URL

Я использую VC++ и пытаюсь разобрать IP-адрес (ipv4/ipv6) из полученного URL-адреса. Есть ли способ добиться этого. Я знаю, что один из способов - перебирать каждый символ в URL-адресе и искать [ и ] в URL-адресе для ipv6. Это не кажется хорошим способом, поэтому интересно, есть ли какая-либо функция, которая поможет мне извлечь IP-адрес из URL-адреса?

Например, у меня есть URL, как указано ниже,

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


person jdp    schedule 22.02.2014    source источник
comment
Использовать регулярные выражения?   -  person Cornstalks    schedule 22.02.2014
comment
Я думаю, что Regex поможет мне подтвердить, что введенный ipv4/ipv6 находится в допустимой форме или нет. Как я могу анализировать/извлекать ipv4/ipv6 с помощью регулярных выражений?   -  person jdp    schedule 22.02.2014
comment
Вы можете использовать группы захвата для извлечения IP. Любая приличная библиотека регулярных выражений поддерживает группы захвата.   -  person Cornstalks    schedule 22.02.2014


Ответы (2)


Поскольку вы пометили вопрос тегом visual -c++, я мог бы предложить вам использовать InternetCrackUrl( ) из библиотеки wininet для разбора.

person mike.dld    schedule 22.02.2014

Немного кода из парсера 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);
    }

Но эй, если вам нравятся регулярные выражения, вот одно из взлома URL-адресов Perl:

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

Должно быть просто преобразовать это в библиотеку регулярных выражений С++.

person Zan Lynx    schedule 22.02.2014