Регулярные выражения работают через раз
Добрый вечер!
Возникла проблема: Есть вот такой массив регулярок (проверяет ссылки на принадлежность к файлообменникам): 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, время: 13:08. |