【问题标题】:Extract US phone numbers from a string从字符串中提取美国电话号码
【发布时间】:2016-11-07 04:45:09
【问题描述】:

我正在尝试从字符串中提取仅限美国的电话号码。

我浏览了网络/SO,但没有找到任何适合我需要的解决方案。

说实话,我有 2.5 年的 Web 编程经验,但我在 RegEX 方面很烂。

这里只是我写的正则表达式(\d{3}+\-\d{3}+\-\d{4}+)

但它只检测到589-845-2889

这是我要提取的电话号码。

589-845-2889

(589)-845-2889

589.845.2889

589 845 2889

5898452889

(589) 845 2889

请告诉我如何在 PHP 的单个 Regex 中实现这一壮举。

编辑:

如果您觉得用户可以输入任何其他格式的美国号码,请同时提及,并将其包含在 RegEX 中。

附注:

实际上,我正在尝试抓取 Craiglist,用户可能已经以任何可能的格式发布了他们的电话号码。

【问题讨论】:

标签: php regex


【解决方案1】:

在 PHP (PCRE) 中,您可以使用基于 conditional subpatterns 的正则表达式:

(\()?\d{3}(?(1)\))[-.\h]?\d{3}[-.\h]?\d{4}

RegEx Demo

  • (\()? 匹配可选的 ( 并在组 #1 中捕获它
  • (?(1)\))条件模式,仅当组 #1 不为空时匹配关闭 ),即 ( 出现在匹配的左侧。

【讨论】:

  • 为什么会有奇怪的结果? sandbox.onlinephpfunctions.com/code/…
  • 我的意思是,它返回 2 个数组,第一个数组很好,第二个数组是什么?
  • 您应该使用var_dump($result[0]); 获取结果。 Check this demo now
  • 第二个数组或$result[1] 显示第一个捕获的组,仅当输入以( 开头时才会填充该组
  • +1 这有 cmets 这实际上会帮助用户前进。其他答案只是解决方案。教一个人如何钓鱼等等。
【解决方案2】:

终于成功了:

^(\((\d{3})\)|(\d{3}))[\s\-\.]?\d{3}[\s\-\.]?\d{4}

在记事本++中测试

【讨论】:

    猜你喜欢
    • 2013-07-13
    • 2011-05-22
    • 1970-01-01
    • 2011-03-06
    • 2023-03-16
    • 2013-10-01
    • 1970-01-01
    • 2012-05-22
    • 2010-09-15
    相关资源
    最近更新 更多