Регулярное выражение JavaScript не соответствует тегам <a> - PullRequest
1 голос
/ 03 сентября 2010

Я пытаюсь сопоставить 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]));
}

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

Ответы [ 2 ]

2 голосов
/ 03 сентября 2010

Вам необходимо избегать обратной косой черты при создании регулярных выражений с новым 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.
0 голосов
/ 03 сентября 2010

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

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

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

Вы не учитываете 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]));
}

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

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