2

我想使用 Javascript 中的正则表达式验证 10 位美国风格的电话号码,然后通过 url 将其提交到 PHP 服务器。这将是一个表单中的简单文本框,用于输入数字和提交按钮。

例如,在验证之后,url 可能是:

thisdomainname.com/resultspage.php?phonenumber=4392931234

我知道正则表达式是如何工作的,但对更复杂的表达式感到困惑。我在 stackoverflow 和互联网上搜索了一个解决方案,发现了几个但没有一个完全符合我的需要和/或在我运行它时可以工作。

我需要它来省略所有非数字字符(例如括号、破折号和句点),并且还省略在美国 10 位电话号码中可选的额外前导“1”。

它应该允许(验证为正确)以下格式:

  • 1-(805) xxx-xxxx

  • 215.xxx.xxxx

但拒绝为无效:

  • 805 931 42
  • 805 931 42ab
  • 105 931 4288

理想情况下,它将根据“北美编号计划”允许电话号码,该计划具有以下规则:

“区号以 2-9 的数字开头,然后是 0-8,然后是任何第三个数字。第二组三位数字,称为中心局或交换代码,以 2-9 的数字开头,然后是任意两位数字。最后四位数字,称为站号,没有限制。

我在下面找到了一个正则表达式来实现它,但我无法让它与可选的前导“1”数字一起使用。

^\(?([2-9][0-8][0-9])\)?[-. ]?([2-9][0-9]{2})[-. ]?([0-9]{4})$

就像我说的,我已经找到了很多解决这个问题的解决方案,但是没有一个适用于我上面列出的所有情况。

提前致谢。

4

2 回答 2

3

一种更简单的方法是删除所有非数字字符并确保位数有效

function isValidPhoneNumber(value) {
    if (!value) return false;
    var count = value.replace(/[^0-9]/g, "").length;

    return count == 10 || count == 11;
}
于 2013-09-08T02:25:35.867 回答
0

同意罗伯特·伯恩(Robert Byrne)在测试之前从输入字符串中删除所有非数字字符。在此处进一步测试您针对可接受数字所述的附加规则:

<?php

$testStr = "134dusrtu56sdjhsdf7890asd     01";  // input string
$parsedResult = preg_replace( '/[^\d]/', '', $testStr ); // remove non-numeric characters
$confirmation = ( preg_match( '/^[1]?[2-9][0-8][0-9][2-9][\d]{6}$/', $parsedResult ) === 1 ); // parsed numeric string meets your rules?

echo $parsedResult . ": " . (int) $confirmation; // 13456789001: 1 (1=true;0=false)

另外,只是一个预防措施:永远不要将电话号码转换为整数 - 可能会发生溢出。此外,存储解析后的号码而不是客户端的原始输入也非常好,尤其是当您使用带有自动文本或拨号服务的号码时。

于 2013-09-08T02:48:10.270 回答