Регулярные выражения работают через раз
Добрый вечер!
Возникла проблема: Есть вот такой массив регулярок (проверяет ссылки на принадлежность к файлообменникам):
var pattern=[
/https{0,1}:\/\/(www.){0,1}rapidshare.com\/.*/gi ,
/https{0,1}:\/\/(www.){0,1}letitbit.net\/.*/gi
]
Выполняю один и тот же код в разной последовательности: ab
var a="http://www.rapidshare.com/files/421054723/Avatar.2010.DVD5.part01.rar";
var b="http://www.rapidshare.com/files/421054763/Avatar.2010.DVD5.part02.rar";
if(pattern[0].test(a)){alert(a);}
if(pattern[0].test(b)){alert(b);}
Выводится только переменная a; ba
var a="http://www.rapidshare.com/files/421054723/Avatar.2010.DVD5.part01.rar";
var b="http://www.rapidshare.com/files/421054763/Avatar.2010.DVD5.part02.rar";
if(pattern[0].test(b)){alert(b);}
if(pattern[0].test(a)){alert(a);}
Выводится только переменная b; Хотя по логике должны выводиться обе переменные, только в разной последовательности. Но выходит что регулярка работает при первой проверке, но не работает при второй. Более того, они работают при нечетных проверках, и не работают при четных (проверял практически)! В чем проблема, чего я не понимаю? Помогите пожалуйста!!! Спасибо!!! |
а что по вашему должен делать модификатор g?
раз уж используете его, то и почитали бы как именно он работает http://javascript.ru/RegExp/lastIndex http://javascript.ru/tutorial/regexp-specials#nayti-vse |
Да, убрал модификатор g и все заработало! Спасибо!
|
У вас во-первых в выражении указан протокол 'https', во-вторых, названия всех файлообменников как-правило уникальны и можно значительно сократить выражение...
Можно же все проще сделать:
var str = ['http://rapidshare.com', 'http://letitbit.net', 'http://ifolder.ru']
var reg = /rapidshare|letitbit|ifolder/;
for(i=0; i<str.length; i++){
if(reg.test(str[i])){
alert(str[i]);
}
}
Ну а относительно вашего примера:
var pattern=[/rapidshare/]
var b="http://www.rapidshare.com/files/421054763/Avatar.2010.DVD5.part02.rar";
var a="http://www.rapidshare.com/files/421054723/Avatar.2010.DVD5.part01.rar";
if(pattern[0].test(a)){alert(a);}
if(pattern[0].test(b)){alert(b);}
|
monolithed
В моем регулярном выражении
/https{0,1}:\/\/(www.){0,1}rapidshare.com\/.*/i
https{0,1} говорит о том, что http встречается обязательно, а s - 0 или 1 раз. То есть тут охвачен и http и https. Действительно можно упростить регулярку, но на разных сайтах встречаются ссылки разного вида (с www и без), и к тому же могут встретиться ссылки, содержащие названия файлообменника, а вести на какой-то сайт. Если честно, то начал с самого простого, а на этапе тестирования пришлось усложнить :) Спасибо за участие в дискуссии |
На последок вставлю свои пять копеек: вместо '{0,1}' юзайте '?' - кошернее.)
|
| Часовой пояс GMT +3, время: 06:34. |