JavaScript отвергает все мои RegExs, как получилось? - PullRequest
2 голосов
/ 13 июля 2010

У меня есть это в данный момент, (я нашел код здесь).

     var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
     someText.replace(exp, "<a href='$1'>$1</a>");  

Он заменит любой http://URL в некотором тексте на правильный <a href>

Но я также требую, чтобы он соответствовал www.без http.Я нашел этот RegEx на RegEx Lib.

((http\://|https\://|ftp\://)|(www.))+(([a-zA-Z0-9\.-]+\.[a-zA-Z]{2,4})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(/[a-zA-Z0-9%:/-_\?\.'~]*)?

И я проверил на сайте проверки RegEx, http://www.nvcc.edu/home/drodgers/ceu/resources/test_regexp.asp

Он соответствует строкам, которые я хочу.Но когда я помещаю его в свою переменную exp, JavaScript взрывается и вызывает ошибку.

Я даже пытался обновить его как новый RegExp, вот так.

var exp = new RegExp(((http\://|https\://|ftp\://)|(www.))+(([a-zA-Z0-9\.-]+\.[a-zA-Z]{2,4})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(/[a-zA-Z0-9%:/-_\?\.'~]*)?);

Но происходит то же самое.

Есть идеи, что я делаю неправильно?

Спасибо, Кохан

Ответы [ 3 ]

6 голосов
/ 13 июля 2010

Я считаю, что конструктор RegExp принимает строку в качестве аргумента, см. Здесь: https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/RegExp

Так что просто ставьте кавычки вокруг вашего регулярного выражения, и оно должно работать нормально.

var exp = new RegExp("((http\\://|https\\://|ftp\\://)|(www.))+(([a-zA-Z0-9\\.-]+\\.[a-zA-Z]{2,4})|([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}))(/[a-zA-Z0-9%:/-_\\?\\.'~]*)?");
someText.replace(exp, "<a href='$1'>$1</a>");
2 голосов
/ 13 июля 2010

Хорошо, вы исправили синтаксис JavaScript, теперь давайте поговорим о синтаксисе regex .Двоеточие (:) не имеет особого значения, поэтому нет необходимости избегать его.Точка (.) и вопросительный знак (?) обычно имеют специальные значения, но не в том случае, если они появляются в классе символов (т. Е. В квадратных скобках).

Дефис (-) имеет особое значение в классе символов: он образует диапазоны, например [a-z] и [0-9].Если вы хотите включить буквальный дефис в класс символов, вы можете либо экранировать его обратной косой чертой, либо поместить его в начало или конец списка.Например, в [a-zA-Z0-9\.-] последний дефис соответствует дефису, а остальные три используются для формирования диапазонов.(Обратная косая черта перед точкой не нужна, но она ничему не вредит.)

Теперь посмотрите на [a-zA-Z0-9%:/-_\?\.'~].Обратные слеши перед ? и . просто беспорядочные, но этот дефис является реальной проблемой.Он формирует диапазон, начинающийся с / и заканчивающийся _;если вы посмотрите на карту символов ASCII, то увидите, что она включает цифры 0-9 и заглавные буквы A-Z, плюс

/, :, ;, <, =, >, ?, @, [, \, ], ^, _

... явно не то, что авторпредназначена.В этом регулярном выражении также много ненужной группировки и дублирующегося кода, и вам действительно нужно сопоставлять IP-адреса?Мораль такова: не верь ничему, что найдешь на RegExLib.com.

0 голосов
/ 13 июля 2010

Регулярное выражение в javascript должно быть заключено в косую черту '/', поэтому оно будет выглядеть как

var expr = /pattern/flags;

для вас основной путь -

var exp = /((http\://|https\://|ftp\://)|(www.))+(([a-zA-Z0-9\.-]+\.[a-zA-Z]{2,4})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(/[a-zA-Z0-9%:/-_\?\.'~]*)?/;

Если вы используете конструктор new RegExp (), вызовите его в форме

var expr = new RegExp(pattern [, flags]);

здесь pattern и flags это строковые параметры

var exp = new RegExp("((http\://|https\://|ftp\://)|(www.))+(([a-zA-Z0-9\.-]+\.[a-zA-Z]{2,4})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(/[a-zA-Z0-9%:/-_\?\.'~]*)?");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...