2016-07-05 142 views
7

我正试图从字符串中提取美国电话号码。从字符串中提取美国电话号码

我已经浏览了网页/ SO,但还没有找到任何适合我需求的解决方案。

说实话,我在网络编程方面拥有2.5年的经验,但我在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单正则表达式。

编辑:

如果你觉得美国数用户可以输入任何其他格式,还提到,为好,包括在正则表达式为好。

P.S:

其实我想刮Craiglist上和用户可能已经张贴在任何可能的形式他们的电话号码。

+0

589 845-2889'应该匹配吗? – anubhava

+0

是的,用户可以输入他的号码的任何可能的方式 – Umair

+1

[电话号码验证综合正则表达式]的可能重复(http://stackoverflow.com/questions/123559/a-comprehensive-regex-for-phone-number-验证) – hugomg

回答

2

在PHP(PCRE)测试,你可以使用基于conditional subpatterns这个表达式:

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

RegEx Demo

  • (\()?个匹配可选(并捕获它在组#1
  • (?(1)\))条件模式该匹配闭)仅当组#1不为空即(存在于左匹配的。
+0

为什么它有奇怪的结果? http://sandbox.onlinephpfunctions.com/code/b3b6cf795b8026c85d5c9bbdc04943978e94e8d0 – Umair

+0

我的意思是,它返回2个数组,第1个数组很好,第2个数组是什么? – Umair

+0

你应该使用'var_dump($ result [0]);'为你的结果。 [立即查看此演示](http://sandbox.onlinephpfunctions.com/code/1cc85f77cb46becf28711e9162c8ea601d752375) – anubhava

1

最后,它的工作原理:

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

在记事本++