Я взял Либеральный URL Regex от Смелости Шаровой молнии, объединил его с некоторыми улучшениями 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]|\/
часть regex не выполняется, когда URL имеет круглые скобки, я пробовал в течение некоторого времени, но я, может казаться, не нахожу решение. Кто-либо может помочь мне?
Для товара я настроил постоянную ссылку Rubular с regex и некоторыми данными тестирования (последние сбои URL).
Я думаю, что regex 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(неважно)'
, он был бы распознан правильно. (Или, по крайней мере, в моих тестах)
/(?:[\w-]+:\/\/?|www[.])[^\s()<>]+(?:(?:\([^\s()<>]*\)[^\s()<>]*)+|[^[:punct:]\s]|\/)/
www. | | |
dsd | |
(sd) |
sdsd.com'
Вот как, я думаю, это ломается... бит регекса выше (sd)
начинается с экранированного открытого отца, затем с просматриваемого класса char, соответствующего sd
, затем с экранированного закрывающего отца, и следующее: [^\s()<>]*
, который соответствует sdsd.com'
.