1

Тема: Ошибка в регулярном выражении

Помогите, пожалуйста, найти ошибку в следующем регулярном выражении:

var r = /^((((ht|f)tp(s?))\://)|(/{1}))?((([a-zA-Z0-9_\-]{2,}\.)+[a-zA-Z]{2,})|((?:(?:25[0-5]|2[0-4]\d|[01]\d\d|\d?\d)(?(\.?\d)\.)){4}))(:[a-zA-Z0-9]+)?(/[a-zA-Z0-9\-\._\?\,\'/\\\+&%\$#\=~]*)?$/;

Пробовал экранировать "//" с помощью "\/\/", не помогло.

Заранее спасибо за ответ!

2 (изменено: Rumata, 2012-12-11 17:46:51)

Re: Ошибка в регулярном выражении

Обязательно экранируйте все прямые и обратные слеши.

Определение IP неверно. И там есть ошибка - в одном месте должно быть (?:( )) вместо (?( )). Правильное выражение для IP может быть примерно таким

(?:(?:[01]?\d\d?|2[0-4]\d|25[0-5])\.){3}(?:(?:[01]?\d\d?|2[0-4]\d|25[0-5]))

Вычисление протокола очень сложное. Достаточно одного из вариантов


\w+:\/\/
[a-z]+:\/\/

В общем случае используйте незапоминающие скобки (?: ) вместо запоминающих ( ). Последние - только для запоминания и последующего использования результата разбора строки.

В последней части выражения уже не стал вчитываться. То ли там опечатка, то ли это огрехи парсера форума - подставилось &. Явно лишнее.

Верно ли я понял, что Вы хотите охватить все случаи вида proto://address/path/to/the/source и /path/to/the/source?
Лучше рассмотрите отдельно - URL, отдельно - пути. Однако URL в Вашей реализации не включает случаи ввода пары логин/пароль или ее частей. Например:


username@address.domain
ftp://username:passowrd@address.domain
( 2 * b ) || ! ( 2 * b )

3

Re: Ошибка в регулярном выражении

Вы частично правы. Я пытаюсь отследить URL, который может включать в себя как абсолютный (с необязательным, но возможным протоколом), так и относительный путь. При этом домен может быть заменён эквивалентом IP-адреса.

4

Re: Ошибка в регулярном выражении

В интернете есть готовые решения. Посмотрите одно из них здесь - http://with-love-from-siberia.blogspot. … cript.html. Свойства возвращаемого объекта совместимы со свойствами браузерного объекта location. Пример использования:


var parsed = url.parseUrl();
alert(parsed.host);
alert(parsed.port);
alert(parsed.path);
alert(parsed.query);
( 2 * b ) || ! ( 2 * b )

5 (изменено: Holfisteng, 2012-12-11 19:27:35)

Re: Ошибка в регулярном выражении

Спасибо за ссылку, но этому регулярному выражению не нравятся относительные пути, а это крайне важно для меня. Ищу уже который час, у всех есть свои изъяны.

Update: нашёл решение проблемы здесь. Может, кому понадобится. Там примеры регулярок под разные степени сложности URL.

6

Re: Ошибка в регулярном выражении

/g

Я конечно далек от мысли... (с)