【问题标题】:Regex to match and extract North American phone numbers正则表达式匹配和提取北美电话号码
【发布时间】:2021-11-29 07:13:47
【问题描述】:

我需要从文本中匹配并提取电话号码...这种格式的电话号码:

589-845-2889

(589)-845-2889

589.845.2889

589 845 2889

5898452889

(589) 845 2889

以下操作与上述匹配非常准确:

preg_match_all("/(\()?\d{3}(?(1)\))[-. ]?\d{3}[-. ]?\d{4}/", $test, $result);

所以我需要扩展它以支持国际前缀,例如1+1。因此,它还应该匹配1(589) 845 2889+1(589) 845 28891589 845 28891 589 845 288915898452889 等。

任何帮助将不胜感激。

【问题讨论】:

  • 在开头包含(\+?1 ?)?
  • 你为支持1+1做了什么?
  • 试过(?:1(?:[. -])?),但它只匹配带有 1、+1 的那些。排除其他人。
  • @Phil,谢谢,可以工作,但在 +1207 244 7002+1 207 244 7002 等一些极端情况下会失败
  • @nice_dev 不应该是

标签: php regex regex-group


【解决方案1】:

对于示例数据,您可以使用:

^(?:\+?1\h*)?(?:(\()?\d{3}(?(1)\))[-. ]?\d{3}[-. ]?\d{4})$

模式匹配:

  • ^ 字符串开头

  • (?:\+?1\h?)? 可选匹配 1 可选前缀 + 或后跟空格

  • (\()?\d{3}(?(1)\))括号之间是否匹配3位数字

  • [-. ]?匹配可选-.

  • \d{3} 匹配 3 位数字

  • [-. ]?匹配可选-.

  • \d{4} 匹配 4 位数字

  • $字符串结束

Regex demo | Php demo

例子

$re = '/^(?:\+?1\h?)?(\()?\d{3}(?(1)\))([-. ]?)\d{3}\2\d{4}$/m';
$str = '589-845-2889
(589)-845-2889
589.845.2889
589 845 2889
5898452889
(589) 845 2889
1(589) 845 2889
+1(589) 845 2889
1589 845 2889
1 589 845 2889
15898452889
+1207 244 7002
+1 207 244 7002
(589) 845-2889
+1(589) 845-2889
1(589) 845-2889';
preg_match_all($re, $str, $matches);
print_r($matches[0]);

输出

Array
(
    [0] => 589-845-2889
    [1] => (589)-845-2889
    [2] => 589.845.2889
    [3] => 589 845 2889
    [4] => 5898452889
    [5] => (589) 845 2889
    [6] => 1(589) 845 2889
    [7] => +1(589) 845 2889
    [8] => 1589 845 2889
    [9] => 1 589 845 2889
    [10] => 15898452889
    [11] => +1207 244 7002
    [12] => +1 207 244 7002
)

【讨论】:

【解决方案2】:

替代方法:

您可以将所有不同的类型转换为由. 分隔的 1 种通用语法。 现在,您可以尝试进行 2 次检查。

  • 如果都是数字且长度为 10 或 11。
  • 或者如果它遵循+1.207.333.4444207.333.4444+1(207).333.4444(207).333.4444的格式。

片段:

<?php

function isValid($str){
    $str = preg_replace('/[.\-\s]/','.',$str);
    return preg_match('/^\d{10,11}$/', $str) === 1 || 
           preg_match('/^((\+?\d)?\.?(\d{3}|\(\d{3}\)))\.(\d{3})\.(\d{4})$/', $str) === 1;
}

Online Demo

建议:

不要在 UI 上提供简单的文本框,而是提供由某些文本分隔的 3-4 个块,例如 -.。这样,在后端处理它们或添加 javascript 验证变得容易。

.input_ph{
 width:35px;
}
<html>
<body>
<span>+</span><input type="textbox" class="input_ph" />&nbsp;&nbsp;&nbsp;
<span>-</span>&nbsp;&nbsp;&nbsp;
<span>(</span><input type="textbox" class="input_ph" />
<span>)</span>&nbsp;&nbsp;&nbsp;
<span>-</span>&nbsp;&nbsp;&nbsp;<input type="textbox" class="input_ph" />
&nbsp;&nbsp;&nbsp;
<span>-</span>&nbsp;&nbsp;&nbsp;<input type="textbox" class="input_ph" />
&nbsp;&nbsp;&nbsp;
</body>
</html>

【讨论】:

  • 感谢您的全新视角。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-16
  • 2020-01-18
  • 2014-01-27
  • 1970-01-01
  • 2012-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多