2010-09-02 56 views
1

我试图用经过测试的正则表达式来匹配URL,但是当我使用JavaScript来评估它时,返回false。JavaScript正则表达式不匹配<a>标签

这里是我的代码:

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

难道[厄尔(http://en.wikipedia.org/维基/ Hurricane_Earl_%282010%29)? – BalusC 2010-09-02 21:25:06

回答

0

有多种问题。

您需要避开反斜杠。任何具有特殊含义的字符都需要在正则表达式中使用反斜线进行转义,并且反斜杠本身需要在字符串中转义。实际上,如果使用new Regexp("\\s")构建\s,则应将其表示为\\s

您需要在网址中允许更多字符。目前,您甚至不允许/个字符。我会建议像[^"]这样的角色类来匹配http://之后的所有内容。在TA字符串中使用将使[^\"]时(转义字符"

你不采取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])); 
} 

所有三个例子匹配这个正则表达式。

2

由于您传递了一个字符串,并且反斜杠也是字符串的转义字符,所以在创建正则表达式时需要使用新的RegExp()转义反斜杠。

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

或者只是把你的正则表达式写成文字。

var re = /\s/; 

另外,如果您想要匹配网址,为什么要考虑整个HTML标记? 下面的正则表达式就足够了:

var urlReg = /^(?:\#\dhttp|ftp):\/\/[\w\d\.-_]*\/[^\s]*/i; 
// anything past the third/that's not a space, is valid. 
+0

我不敢相信我忽略了这一点。感谢您的帮助,那是我的问题。我一直盯着这个表达式,试图弄清楚这一点太久了。非常感激! – Wade 2010-09-02 21:36:39