Я пытаюсь сопоставить URL-адреса с проверенным выражением Regex, но когда я использую JavaScript для оценки, оно возвращает false.

Вот мой код:

var $regex = new RegExp("<a\shref=\"(\#\d+|(https?|ftp):\/\/[-a-z0-9+&@#\/%?=~_|!:,.;\\(\\)]+)\"(\stitle=\"[^\"<>]+\")?\s?>|<\/a>");

var $test = new Array();
$test[0] = '<a href="http://www.nytimes.com/imagepages/2010/09/02/us/HURRICANE.html">';
$test[1] = '<a href="http://www.msnbc.msn.com/id/38877306/ns/weather/%29;">';
$test[2] = '<a href="http://www.msnbc.msn.com/id/38927104" title="dd" alt="dd">';
for(var i = 0; i < $test.length; i++)
{
    console.log($test[i]);
    console.log($regex.test($test[i]));
}

Кто-нибудь знает, что происходит?

1
Wade 3 Сен 2010 в 01:18

2 ответа

Лучший ответ

Есть несколько проблем.

Необходимо избегать обратной косой черты. Любой символ со специальным значением должен быть экранирован обратной косой чертой в регулярном выражении, а сама обратная косая черта должна быть экранирована в строке. Фактически, \s должен быть представлен как \\s, если вы создаете его с помощью new Regexp("\\s").

Вам необходимо разрешить использование большего количества символов в ваших URL-адресах . В настоящее время вы даже не разрешаете символы /. Я бы предложил класс символов, например [^"], чтобы соответствовать всему, что находится после http://. (Экранирование символа " при использовании в строке t сделает ее [^\"].

Вы не учитываете атрибуты alt . Вы сопоставляете только атрибуты title, но не атрибуты alt.

Рабочий пример:

// Ditch new Regex("...") in favour of /.../ because it is simpler.
var $regex = /<a\shref="(#\d+|(https?|ftp):\/\/[^"]+)"(\stitle="[^"]+")?(\salt="[^"]+")?|<\/a>/;

var $test = new Array();
$test[0] = '<a href="http://www.nytimes.com/imagepages/2010/09/02/us/HURRICANE.html">';
$test[1] = '<a href="http://www.msnbc.msn.com/id/38877306/ns/weather/%29;">';
$test[2] = '<a href="http://www.msnbc.msn.com/id/38927104" title="dd" alt="dd">';
for(var i = 0; i < $test.length; i++)
{
    console.log($test[i]);
    console.log($regex.test($test[i]));
}

Все три примера соответствуют этому регулярному выражению.

0
molf 2 Сен 2010 в 21:33

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

new RegExp("\s"); // becomes /s/
new RegExp("\\s"); // becomes /\s/

Или просто напишите свое регулярное выражение в виде литералов.

var re = /\s/;

Кроме того, если вы хотите сопоставить URL-адреса, зачем учитывать весь HTML-тег? Достаточно следующего регулярного выражения:

var urlReg = /^(?:\#\dhttp|ftp):\/\/[\w\d\.-_]*\/[^\s]*/i;
// anything past the third / that's not a space, is valid.
2
BGerrissen 2 Сен 2010 в 21:41