2013-08-27 2 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

Зачем использовать конструктор регулярных выражений с постоянной строкой? Просто используйте литерал regexp, как вы использовали в консоли. – Musa

+0

В несвязанной заметке вам также нужно избежать символов '.' В регулярном выражении. Опять же, это две обратные косые черты в строковых литералах, одна в регулярных выражениях. (За исключением того, что для первого '.' Не требуется экранирование, потому что оно находится в символьном классе, поэтому правила разные.) NB: Маленькие вещи, подобные этому, иногда могут поставить под угрозу безопасность. Например, если ваш код предполагает, что любой 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/))"; 
Смежные вопросы