Справка, взламывающая либеральный URL Gruber Regex

Я взял Либеральный 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

10
задан Alix Axel 14 January 2010 в 07:40
поделиться

3 ответа

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

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

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

4
ответ дан 4 December 2019 в 03:16
поделиться

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

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

1
ответ дан 4 December 2019 в 03:16
поделиться
 /(?:[\w-]+:\/\/?|www[.])[^\s()<>]+(?:(?:\([^\s()<>]*\)[^\s()<>]*)+|[^[:punct:]\s]|\/)/
  www.                   |               |            |
                          dsd            |            |
                                          (sd)        |
                                                       sdsd.com'

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

1
ответ дан 4 December 2019 в 03:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: