Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Странно работает регулярка в JS (https://javascript.ru/forum/misc/15672-stranno-rabotaet-regulyarka-v-js.html)

_axl 09.03.2011 11:03

Странно работает регулярка в JS
 
Написал регулярку для валидации e-mail, она оч странно работает, в первый вызов true, в следующий false. Проверил в php - все работает.
Бентчмарк:
var rules = new Array();
rules['email'] = /[\w_\-\.]+@[\w_\-\.]+\.\w{2,4}/ig;	
email = 'abc@mail.ru';
setInterval(function(){console.log(  rules['email'].test( email ) )}, 500);

Подскажите, в чем проблема?

Kolyaj 09.03.2011 11:21

Используйте
email.match(rules['email'])

Sweet 09.03.2011 11:41

rules - не массив, быдлокодер:-/

_axl 09.03.2011 13:36

нашел я решение, проблема в том, что lastIndex не обнуляется после каждой итерации, надо убрать модификатор g и поставить конец строки $:
Цитата:

rules['email'] = /[\w_\-\.]+@[\w_\-\.]+\.\w{2,4}$/i;
Цитата:

rules - не массив, быдлокодер
к чему это вообще? а что это по-твоему?

рони 09.03.2011 13:38

_axl,
Это особенности регулярок ...
Выход: не использовать ключ g или формировать регулярку во время тестирования
1 вариант
<div id="show"></div>
<script type="text/javascript">
var d = document.getElementById('show'),
email = 'abc@mail.ru',
rules = new Array();
rules['email'] = /[\w_\-\.]+@[\w_\-\.]+\.\w{2,4}/i;
setInterval(function(){d.innerHTML+= rules['email'].test( email )+"<br />"}, 500);
</script>

2 вариант
<div id="show"></div>
<script type="text/javascript">
var d = document.getElementById('show'),
email = 'abc@mail.ru';
setInterval(function(){d.innerHTML+= new RegExp("[\\w_\\-\\.]+@[\\w_\\-\\.]+\\.\\w{2,4}","ig").test( email )+"<br />"}, 500);
</script>

Matre 09.03.2011 13:47

Цитата:

к чему это вообще? а что это
Это "ассоциативный массив" ("хэш") или просто объект, если быть совсем Ъ.

_axl 09.03.2011 14:02

О Госпаде, а я то думал, мне щас шамбалу откроют :D

Kolyaj 09.03.2011 14:04

Цитата:

Сообщение от _axl
var rules = new Array();
rules['email'] = /[\w_\-\.]+@[\w_\-\.]+\.\w{2,4}/ig;

Эта запись равносильна
var rules = new String();
rules['email'] = /[\w_\-\.]+@[\w_\-\.]+\.\w{2,4}/ig;

Т.е. массив вы используете не по назначению. Вам нужно
var rules = {};

_axl 09.03.2011 14:10

Ну как бы массив я использую, т.к. правил валидации может быть много, и я хочу хранить их в одной переменной.
И я не спорю, можно как и объект хранить,но какая разница в данном случае?

Matre 09.03.2011 14:19

_axl

Разница в том, что Вы можете написать rules = {} и избавиться от негодования в свой адрес со стороны Умных Людей.


Часовой пояс GMT +3, время: 19:36.