Помогите взломать либеральный URL-адрес Грубера - PullRequest
10 голосов
/ 08 января 2010

Я взял Regex для либерального URL из 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 содержит круглые скобки , я пытался в течение некоторого времени, но, похоже, не могу найти решение. Кто-нибудь может мне помочь?

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


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

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

Я еще больше впечатлен, увидев, что и Грубер и Алан пропустили эту действительно простую опечатку:

\([\w\d]+\)

Разве \(\w+\) не хватит? : S

Ответы [ 3 ]

4 голосов
/ 14 января 2010

Похоже, Грубер изменил свое регулярное выражение :

\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.])(?:[^\s()<>]+|\([^\s()<>]+\))+(?:\([^\s()<>]+\)|[^`!()\[\]{};:'".,<>?«»“”‘’\s]))

Отлично работает сейчас .

1 голос
/ 12 января 2010
 /(?:[\w-]+:\/\/?|www[.])[^\s()<>]+(?:(?:\([^\s()<>]*\)[^\s()<>]*)+|[^[:punct:]\s]|\/)/
  www.                   |               |            |
                          dsd            |            |
                                          (sd)        |
                                                       sdsd.com'

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

1 голос
/ 08 января 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...