1

我正在修改脚本。该脚本包含一个表单,允许访问者向电话号码发送 SMS。在表单中,我有一个文本框,用户可以在其中输入文本接收者的电话号码。我正在使用正则表达式来验证电话号码,以防止垃圾邮件发送者并确保用户输入了正确的号码。

以下是阿富汗使用的默认电话号码:

+93785657024
+93795657024
+93700565656
+93775657024

正则表达式验证首先应确保使用 +93,然后确保在 +93 之后使用 78、77、79 或 700(其中之一),最后是 6 位数字。

这是我要修复的 Javascript 代码。此代码现在仅适用于 +937 后跟 8 位数字。

<script type="text/javascript">
function test (){
  var phoneRegex = new RegExp('^937\d{8}$');
  var phoneNum = document.getElementById("receiver").value;
  if(!(phoneRegex.test(phoneNum))) {
    alert("Invalid Phone Number");
    document.getElementById("receiver").focus();
  } else {
    alert("valid");
  }
}
</script>
4

4 回答 4

2

正则表达式验证首先应确保使用 +93,然后确保在 +93 之后使用 78、77、79 或 700(其中之一),最后是 6 位数字。


除了 700 的情况外,此答案将不起作用,因为 OP 指定所有前缀后跟 6 位数字,而实际上只有 93700 后跟 6,而其他前缀后跟 7 位数字。

/^\+93(77\d|78\d|79\d|700)\d{6}$/

应该这样做。

不过,您的原始正则表达式不需要前面有“+”。

于 2013-07-01T17:47:13.133 回答
1

我认为这将适合您的条件

总共需要 11 位以 + 为前缀的数字。

因此,如果 77|78|79 表示后跟 7 位数字,或者如果 700 表示后跟 6 位数字。

var reg = /^\+93((77|78|79)\d{7}|700\d{6})$/;
console.log(reg.test('+93705657024'));

检查这个小提琴

于 2013-07-01T18:14:57.120 回答
1

正则表达式本身:

var phoneRegex = new RegExp('(937(?:00\\d{6}|[789]\\d{7}))');

笔记:

  • 由于您使用的是new RegExp,因此我没有在表达式周围插入/and 。/(我之所以提到这一点,是因为您评论说其他一些答案根本不起作用,我怀疑这是因为您可能忘记在测试它们之前删除 / 和 / ?它们似乎有一些小问题这就是为什么我也回答的原因,但是如果您删除围绕正则表达式的 / 和 /,其他答案至少应该匹配一些有效的电话号码。)
  • 您在计算数字与您提供的有效阿富汗电话号码示例时似乎犯了一个错误。+9377、+9378 等后面是 7 位而不是 6,而实际上只有 +93700 后面是 6。
  • 我的表达式将完整的电话号码放入临时变量 $1 中,它可以派上用场。(我在比赛的第二部分使用了一个非捕获组作为替代方案,因为当我想对比赛结果做其他事情时,额外的捕获有时会很麻烦。对于你的代码正在做什么,它会起作用与?:我的正则表达式包含或不包含的相同。)
  • 我的表达式不会将匹配锚定到字符串的开头或结尾,因为这样做会返回false带有标点符号的有效数字,就像+您在自己的电话号码中显示的那样。
  • 出于同样的原因,我建议您在检查输入的有效电话号码之前删除非数字字符。现在,使用括号或连字符或任何传统标点符号的电话号码将返回false,即使它们实际上是有效的。
  • 您的代码的这种修改将通过首先删除标点符号来确保正确识别有效的电话号码:

    if(!(phoneRegex.test(phoneNum.replace(/\D+/g, '')))) {
    
  • 如果您对代码进行此修改,那么添加锚定表达式^$围绕我建议的正则表达式将是合适的,以确保它仅包含有效的电话号码,而不是更长的号码,例如信用卡号码。

您的代码检查正则表达式测试结果的方式存在问题。此代码将更适合您:

<script type="text/javascript">
function test (){
  var phoneField = document.getElementById("receiver")
  var phoneNum = phoneField.value;
  if (/^(937(?:00\d{6}|[789]\d{7}))$/.test(phoneNum.replace(/\D+/g, ''))) {
  alert('valid');
  } else {
  alert('Invalid phone number');
  phoneField.focus();
  }
}
</script>
<input id="receiver" value="+93785657024" />
<input type="button" onclick="test()" value="Check this number" />

注意:我把我的一些代码弄混了。请忽略我的其他代码(我的意思是上传到该链接的代码)。这个有效。

于 2013-07-01T18:28:41.190 回答
0

利用:

/^\+937([789]|00)\d\d\d\d\d\d$/

那应该这样做。

+937 你所有的号码都以此开头
([789]|00) 7、8、9 或 00
\d\d​​\d\d\d 6 位数字

于 2013-07-01T17:50:33.000 回答