2016-10-06 1 views
1

Я изо всех сил пытаюсь заставить это регулярное выражение работать с непростыми доменами.Регулярное выражение для домена и расширения не может обрабатывать двойные расширения слова

((https?):\/\/)?(\w+\.)*(?P<domain>\w+)\.(?P<extension>\w+)(\.\w+)(\/.*)? 

Он работает на:

http://google.com 
https://google.com 
http://www.google.com 
https://www.google.com 

Таким образом, в приведенных выше примерах, он распознает домен как google и расширение как .com.

Но если это двойное расширение слово, оно падает:

http://www.google.com.hk 

В приведенном выше примере домен рассматривается как .com и расширение как .hk.

Знаете ли вы, как я могу подстроить регулярное выражение, чтобы понять расширения .com.hk?

спасибо.

+0

Refer this link.Hope работает. [Нажмите здесь] (http://stackoverflow.com/questions/3809401/what-is-a-good-regular-expression-to-match-a-url) –

+0

Нет, эта ссылка не работает. Приветствия. –

+1

Попробуйте это - '. * \: \/\/(?: www \.)? ([^ \ /] +)' – sideroxylon

ответ

1

Разрешить дополнительный «точка-то слово» быть частью расширения:

((https?):\/\/)?(\w+)\.(?P<domain>\w+)\.(?P<extension>\w+(\.\w+)?)(\/.*)? 

Я также удалил * квантор от захвата первой части URL.

0

Попробуйте это - .*\:\/\/(?:www\.)?([^\/ ]+)

Это будет соответствовать расширения в примере. Он останавливается в/или пространстве.

0

Нет понятия расширения, связанного с доменными именами, есть только полное доменное имя (Full Qualified Domain Name), домен верхнего уровня (TLD), метки и поддомены.

Если я ваш последний пример http://www.google.com.hk:

  • www, google, com, hk ярлыки
  • www.google.com.hk является домен и полное доменное имя
  • hk является областью и, поскольку это последнее, это TLD
  • com.hk является hk поддомен
  • google.com.hk является com.hk Поддоменом
  • www.google.com.hk является google.com.hk Поддомена

Важно то, что метка com не имеет ничего особенного здесь и может быть что угодно. У него нет ограничений TLD (TLD не может быть ничего, вы можете найти список here).

Заключение com.hk не отличается от google.hk, google.com, pizza.org, org.pizza(да TLD pizza существует), все они имеют две метки, разделенные точкой: ДВУ и его суб-домен.

Примечание: иногда две последние метки называются SLD (домен второго уровня).


Независимо от используемого вами языка, регулярное выражение не путь, если вы хотите, чтобы разобрать URL по двум основным причинам:

  • синтаксис URL является более сложным, чем вы думаете
  • большинство языков уже инструмент, чтобы сделать это (urllib.parse в Python, parse_url в PHP, в URI класса в C#, java.net.URL в Java, модуль URL-адрес в nodejs ...)

Используя эти инструменты, вы можете легко извлечь имя хоста из URL-адреса.


После нужно проверить сначала, если это имя хоста не является IPv4, потому что в этом случае точки не имеют тот же смысл (есть не здесь, чтобы разделить полное доменное имя в ярлыки, но чтобы отделить четыре номера) или IPv6.

Тогда вам нужно только разбить имя хоста и взять последний элемент для получения TLD. Вы можете присоединиться к остальным элементам назад, чтобы получить «часть поддомена» имени хоста.

Если ваша цель состоит в том, чтобы отделить все метки в конце, которые находятся в списке TLD, вы должны включить этот список так, как вы хотите в свой код, и проверить, находятся ли в нем элементы.

Но еще раз нет «расширения» в доменном имени и даже меньше «двойного расширения слова».

Смежные вопросы