HTML:
<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')
};
};
当我点击按钮时,第一次结果是电话号码或电子邮件&#39; - 这就是我想要的。然后我没有改变任何东西,只是再次点击,结果是“电话号码和电子邮件都没有!”如果我删除了评论,结果始终是电话号码或电子邮件&#39;。为什么呢?
答案 0 :(得分:2)
摆脱正则表达式的g
选项。它会影响行为。
g
选项意味着您希望正则表达式记住上一个匹配结束的位置,并且您希望它在搜索字符串中从那里开始以进行下一个匹配。您显然不需要在代码中使用该行为。
您可以通过查看正则表达式对象的.lastIndex
属性来验证这一点。在第一次成功匹配后,它将具有非零值。该值被解释为搜索字符串中下次尝试匹配时开始的位置。因为.lastIndex
是在正则表达式对象本身上维护的,所以您基本上会忽略针对可能不同的搜索字符串进行测试的事实。
哦,你的console.log()
调用使其有效的原因是,当.lastIndex
值超出字符串的结尾时,它会重新开始{ {1}}!