Ответ 1
Похоже, Грубер пересмотрел свое регулярное выражение:
\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.])(?:[^\s()<>]+|\([^\s()<>]+\))+(?:\([^\s()<>]+\)|[^`!()\[\]{};:'".,<>?«»""‘’\s]))
Я взял Либеральное 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
Похоже, Грубер пересмотрел свое регулярное выражение:
\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.])(?:[^\s()<>]+|\([^\s()<>]+\))+(?:\([^\s()<>]+\)|[^`!()\[\]{};:'".,<>?«»""‘’\s]))
www.dsd(sd) sdsd.com не является допустимым доменным именем.
Если у вас 'www.dsd.com/whatever(whatever)'
, это будет правильно распознано. (Или, по крайней мере, в моих тестах)
/(?:[\w-]+:\/\/?|www[.])[^\s()<>]+(?:(?:\([^\s()<>]*\)[^\s()<>]*)+|[^[:punct:]\s]|\/)/
www. | | |
dsd | |
(sd) |
sdsd.com'
Вот как я думаю, что это ломается... бит регулярного выражения выше (sd)
начинается с экранированного открытого паттерна, а затем в стиле char, соответствующем sd
, затем с закрытым закрывающим парнем, а следующий вещь [^\s()<>]*
, которая соответствует sdsd.com'
.