从字符串中提取美国电话号码

7

我试图从一个字符串中提取仅限美国的电话号码。

我在网上和SO上搜索过,但没有找到适合我的需求的解决方案。

老实说,我有2.5年的Web编程经验,但我很菜于正则表达式。

这是我写的唯一的正则表达式(\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中包括该信息。
附言:
实际上,我正在尝试爬取Craiglist,并且用户可能以任何可能的格式发布他们的电话号码。

589 845-2889 应该匹配吗? - anubhava
是的,用户可以以任何可能的方式输入他的数字。 - Umair Ayub
1
可能是A comprehensive regex for phone number validation的重复问题。 - hugomg
2个回答

2
在PHP(PCRE)中,您可以使用基于条件子模式的正则表达式:
(\()?\d{3}(?(1)\))[-.\h]?\d{3}[-.\h]?\d{4}

正则表达式演示

  • (\()? 匹配可选的 ( 并将其捕获到第1组中
  • (?(1)\)) 是一个条件模式,仅在第1组不为空即左侧有(时匹配右括号)

为什么会有奇怪的结果?http://sandbox.onlinephpfunctions.com/code/b3b6cf795b8026c85d5c9bbdc04943978e94e8d0 - Umair Ayub
我的意思是,它返回2个数组,第一个数组没问题,第二个数组是关于什么的? - Umair Ayub
你应该使用 var_dump($result[0]); 来查看你的结果。现在就检查这个演示 - anubhava
第二个数组或 $result[1] 显示的是第一个捕获组,只有当输入以 ( 开头时才会填充。 - anubhava
1
+1 这里有实际帮助用户的注释。其他答案只是解决方案。教人捕鱼胜过送人鱼。 - webnoob

1
最后,它可以工作了:
^(\((\d{3})\)|(\d{3}))[\s\-\.]?\d{3}[\s\-\.]?\d{4}

在Notepad++中测试过


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接