Справка Hacking Gruber Либеральное URL-адрес Regex

Я взял Либеральное URL-адрес Regex из Daring Fireball, объединил его с некоторые из улучшений Alan Storm и взломали мой путь к исправлению некоторых ошибок, таких как поддержка символов IDN в круглых скобках. Это то, что у меня есть:

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

Однако я столкнулся с ошибкой, которую я не могу решить:

'www.dsd(sd)sdsd.com' // can also be the valid 'www.dsd.com/whatever(whatever)'

Вышеуказанный URL-адрес распознается как www.dsd(sd)sdsd.com' (или www.dsd.com/whatever(whatever)') вместо www.dsd(sd)sdsd.com (или www.dsd.com/whatever(whatever)). Это происходит только тогда, когда URL-адрес имеет круглые скобки, поскольку следующий URL-адрес:

'www.sampleurl.com'

Правильно распознается как www.sampleurl.com.

Я думаю, что часть регулярного выражения [^[:punct:]\s]|\/ не выполняется, когда URL имеет круглые скобки. Я пытался какое-то время, но я не могу найти решение. Кто-нибудь может мне помочь?

Для товара я настроил постоянную ссылку Rubular с регулярным выражением и некоторыми тестовыми данными ( последний сбой URL.)


Я думаю, что регулярное выражение Gruber немного поспешило, например, оно не соответствует URL-адресу, например:

http://en.wikipedia.org/wiki/Something_(Special)_For_You

Я еще больше впечатлен тем, что как Gruber и Alan пропустил эту простую опечатку:

\([\w\d]+\)

Не хватит ли \(\w+\)?: S

Ответ 2

www.dsd(sd) sdsd.com не является допустимым доменным именем.

Если у вас 'www.dsd.com/whatever(whatever)', это будет правильно распознано. (Или, по крайней мере, в моих тестах)

Ответ 3

 /(?:[\w-]+:\/\/?|www[.])[^\s()<>]+(?:(?:\([^\s()<>]*\)[^\s()<>]*)+|[^[:punct:]\s]|\/)/
  www.                   |               |            |
                          dsd            |            |
                                          (sd)        |
                                                       sdsd.com'

Вот как я думаю, что это ломается... бит регулярного выражения выше (sd) начинается с экранированного открытого паттерна, а затем в стиле char, соответствующем sd, затем с закрытым закрывающим парнем, а следующий вещь [^\s()<>]*, которая соответствует sdsd.com'.