2013-08-27 13 views
3

我在遍历链接并选择我需要的正则表达式。JavaScript:循环内外正则表达式测试的不同结果

var str = "http://([^.]*).time.com/($|(page/\d/))"; 
var reg = new RegExp(str); var arr = [], l = document.links; 
for(var i=0; i<l.length; i++) { 
console.log(l[i].href + '\t\t\t-' + reg.test(l[i].href)); 
} 

>... 
>http://newsfeed.time.com/page/3/   -false 
>... 

但是:

/http:\/\/([^.]*).time.com\/($|(page\/\d\/))/.test('http://newsfeed.time.com/page/3/') 
>true 

我在做什么错? :) 谢谢。

+0

为什么你会用一个常量字符串的正则表达式构造函数?只需使用像在控制台中使用的正则表达式字面值即可。 – Musa

+0

在不相关的说明中,您还需要转义正则表达式中的'.'字符。再次,它是字符串文字中的两个反斜杠,一个是正则表达式文字。 (除了第一个'.'不需要转义,因为它在一个字符类中,所以规则是不同的。)注意:这样的小事情有时会危及安全。例如,如果你的代码假设任何与这个正则表达式匹配的URL都是可信的,那么恶意的人可以通过注册URL'http:// my-malicious-url-time.com /'来规避它,已经写了它。 –

回答

1

你一定要逃逸正则表达式的字符串版本反斜杠(即使用\\d):

var str = "http://([^.]*).time.com/($|(page/\\d/))"; 

所以:

var str = "http://([^.]*).time.com/($|(page/\\d/))"; 
var reg = new RegExp(str); var arr = [], l = ['http://newsfeed.time.com/page/3/']; 
for(var i=0; i<l.length; i++) { 
    console.log(l[i] + '\t\t\t-' + reg.test(l[i])); 
} 

给出:

http://newsfeed.time.com/page/3/   -true 
1

当您在字符串中指定正则表达式时,您应该跳过\d中的反斜杠。这在正则表达式中是不需要的,这就是它工作的原因。所以这条线:

var str = "http://([^.]*).time.com/($|(page/\d/))"; 

应该是这样的:

var str = "http://([^.]*).time.com/($|(page/\\d/))";