Я пытаюсь сопоставить 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 ответа
Есть несколько проблем.
Необходимо избегать обратной косой черты. Любой символ со специальным значением должен быть экранирован обратной косой чертой в регулярном выражении, а сама обратная косая черта должна быть экранирована в строке. Фактически, \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]));
}
Все три примера соответствуют этому регулярному выражению.
Вам нужно избегать обратной косой черты при создании регулярных выражений с новым 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.
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.