2015-04-24 2 views
2

HTML:Javascript регулярное выражение странное поведение

<input type="text" id="txt" value="15228868227"><button id="btn">check</button> 

JavaScript:

//email 
var rMail = /^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/g; 
//phone 
var rPhone = /^(13[0-9]|15[0236789]|18[8|9])\d{8}$/g; 

document.getElementById('btn').onclick = function(){ 
    var sTxt = document.getElementById('txt').value; 

    var bMail = rMail.test(sTxt); 
    var bPhone = rPhone.test(sTxt); 
    if(bMail || bPhone){ 
     alert('phone number or email') 
    }; 
    // console.log(!rMail.test(sTxt) && !rPhone.test(sTxt)); 
    if(!bMail && !bPhone){ 
     alert('Neither phone number nor the emial') 
    }; 
}; 

При нажатии на кнопку, в первый раз результат является 'номер телефона или адрес электронной почты' — это то, что я хочу. Тогда я ничего не изменил, просто щелкнул снова, и результат: «Ни номер телефона, ни эмаль»! И если я удалил комментарии, результатом будет всегда «номер телефона или адрес электронной почты». Зачем?

ответ

2

Избавьтесь от опции g в вашем регулярном выражении. Это влияет на поведение.

Опция g означает, что вы хотите, чтобы регулярное выражение запоминало, где закончилось предыдущее совпадение, и что вы хотите, чтобы он начинался там в строке поиска для следующего совпадения. Вы явно не нуждаетесь в этом поведении в своем коде.

Вы можете проверить это, посмотрев свойство .lastIndex объекта регулярного выражения. После первого успешного совпадения он будет иметь ненулевое значение. Это значение интерпретируется как где в строке поиска запускается при следующем попытке совпадения. Поскольку .lastIndex поддерживается на самом объекте регулярного выражения, тот факт, что вы тестируете потенциально различную строку поиска, в основном игнорируется.

Да, и причина того, что ваш console.log() вызов сделал это работа является то, что, когда значение .lastIndexэто за конец строки, он начинает снова над в 0!

Смежные вопросы