Правильное соответствие URL IDN

Мне нужна помощь в создании регулярного выражения, которое может правильно соответствовать URL-адресу внутри свободного текста.

  • схема
    • Один из следующих: ftp , http , https ( ftps протокол?)
  • необязательный пользователь (и необязательный проход )
  • хост (с поддержкой IDN)
    • поддержка WWW и поддоменов (с поддержкой IDN)
    • я считаю, что основная фильтрация TLD ( [a-zA-Z]{2,6}
  • дополнительный номер порта
  • path (необязательно, с поддержкой символов Unicode)
  • запрос (необязательно, с поддержкой символов Unicode)
  • фрагмент (необязательно, с поддержкой символов Unicode)

Вот что я могу узнать о поддоменах:

«Субдомен» выражает относительную зависимость, а не абсолютную зависимость: например, wikipedia.org содержит субдомен домена org, а en.wikipedia.org содержит субдомен домена wikipedia.org. Теоретически это подразделение может опускаться до 127 уровней в глубину, и каждая метка DNS может содержать до 63 символов, если полное доменное имя не превышает общую длину 255 символов.

Что касается самого имени домена, я не смог найти надежный источник, но я думаю, что регулярное выражение для не IDN (я не уверен, как писать версию, совместимую с IDN), это что-то вроде:

 [0-9a-zA-Z][0-9a-zA-Z\-]{2,62} 

Может ли кто-нибудь помочь мне с этим регулярным выражением или указать мне хорошее направление?

Джон Грубер, известность Daring Fireball, недавно опубликовал сообщение, в котором подробно описывается его поисковая строка с регулярным выражением URL. То, что он придумал, было следующим:

\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))

Который, по-видимому, работает и с Юникод-содержащими URL-адресами. Вам нужно будет сделать небольшую модификацию, чтобы получить остальную часть того, что вы ищете – схему, имя пользователя, пароль и т. Д. Алан Шторм написал статью, объясняющую шаблон регулярного выражения Грубера , который мне определенно необходим (регулярное выражение поэтому write-once-have-no-clue-how-to-read-ever-again!).

Если вам нужен протокол и вы не слишком беспокоитесь о ложных срабатываниях, гораздо проще всего совместить все символы без пробелов ://

Это даст вам большую часть пути. Если вам это нужно более подробно, укажите данные теста.

 (ftp|https?)://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?