我正在尝试将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]));
}
任何人都知道发生了什么事?
答案 0 :(得分: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.
答案 1 :(得分:0)
存在多个问题。
你需要转义反斜杠。任何具有特殊含义的字符都需要在正则表达式中使用反斜杠进行转义,并且反斜杠本身需要在字符串中进行转义。实际上,\s
如果使用\\s
构建new Regexp("\\s")
,则应表示为/
。
您需要在网址中添加更多字符。目前,您甚至不允许[^"]
个字符。我建议像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]));
}
属性。
一个工作示例:
{{1}}
这三个例子都匹配这个正则表达式。