2011-02-24 114 views
1

我试图从不同的HTML页面提取特定的信息。基本上,信息是可以有不同的形式,例如一个10个位数:PHP正则表达式,从HTML文档中提取像电话号码正则表达式

 
000-000-0000 
000 - 000 - 0000 
0000000000 
 
please note that 000 - 000 - 0000000 is not a valid phone number so it should not extract the number if it contains any additional digits 

我希望得到任何帮助,创造完美的正则表达式中的所有3种的情况下工作。到目前为止,我只能为最后一个工作(最简单的一个)。

+0

我对这个混淆表示歉意,我最初关闭了不正确的重复。您是否有机会尝试匹配(X)HTML标签中的电话号码? – 2011-02-25 14:43:58

+2

看起来你已经低估了每一个没有做到你正在寻找的答案的答案。这会阻止人们试图帮助你,特别是在容易出错的正则表达式问题中。自发布以来,您也改变了您的问题;您的000 - 000 - 0000000反例未进行第一次编辑,因此@ Jeff的答案符合最初的要求。我注意到他仍然有一个downvote。我不是因为我自己的失望而担心的,更多的是为了帮助你和网站的整体健康状况。 – 2011-02-25 15:39:29

回答

4

这将匹配您列出的所有三个示例。

(\d{3}\s*-?\s*\d{3}\s*-?\s*\d{4}) 
+0

+1比我的简洁得多。猜猜我需要刷上我的正则表达式富有:) – mellamokb 2011-02-24 22:07:17

+1

其基本上是相同的东西,少一些不必要的字符。我爱我一些正则表达式。 – Jeff 2011-02-24 22:09:30

+0

雅我不记得是否 - 是一个特殊的字符,所以我采取了安全的路线。 – mellamokb 2011-02-24 22:51:21

0

\b[0-9]{3}\s*[-]?\s*[0-9]{3}\s*[-]?\s*[0-9]{4}\b

编辑

增加的单词边界。

+0

正则表达式不是很完美..它发现212-642-288455有效(摘录212-642-2884) - – Michael 2011-02-25 00:26:53

+0

你不需要围绕'-'的[],但它应该无论如何工作。 +1。 – 2011-02-25 15:43:37

0

考虑除连字符之外的其他分隔符,更不用说括号。

(?:1\s*?[-.]?\s*)?(?:\(\s*d{3}\s*\)|d{3})\s*?[-.]?\s*\d{3}\s*?[-.]?\s*\d{4}\b 

好吧,也许这是更全面的比你需要的,但实际上这可以得到像你一样复杂。您可以将其展开以查找国际电话号码,附加信息等等,但这可能不适合您。

+0

我认为它根本不起作用... $ htmlContent =“834-343-3434”; $ pattern =“/(?:1\s*?[-.]?\s*)?(?:\(\\s*d{3}\s*\)|d{3})\s ?* [ - ] \ S * \ d {3} \ S * [ - ] \ S * \ d {4} \ b /“?; preg_match_all($ pattern,$ htmlContent,$ matches); print_r($ matches); – Michael 2011-02-25 00:28:13

+0

Array([0] => Array()) – Michael 2011-02-25 00:28:35

+0

@Michael:我不确定这是怎么回事。编辑。仅供参考,通常认为这是一种糟糕的形式,可以降低那些诚实的尝试但失败的东西,除非答案显然是错误的或者适得其反。 – 2011-02-25 15:25:07

4

这里是一个很好的起点:

<?php 

// all on one line... 
$regex = '/^(?:1(?:[. -])?)?(?:\((?=\d{3}\)))?([2-9]\d{2})(?:(?<=\(\d{3})\))? ?(?:(?<=\d{3})[.-])?([2-9]\d{2})[. -]?(\d{4})(?: (?i:ext)\.? ?(\d{1,5}))?$/'; 

// or broken up 
$regex = '/^(?:1(?:[. -])?)?(?:\((?=\d{3}\)))?([2-9]\d{2})' 
     .'(?:(?<=\(\d{3})\))? ?(?:(?<=\d{3})[.-])?([2-9]\d{2})' 
     .'[. -]?(\d{4})(?: (?i:ext)\.? ?(\d{1,5}))?$/'; 

?> 

注意非捕获子模式(看起来像(?:stuff))。这使得格式简单:

<?php 

$formatted = preg_replace($regex, '($1) $2-$3 ext. $4', $phoneNumber); 

// or, provided you use the $matches argument in preg_match 

$formatted = "($matches[1]) $matches[2]-$matches[3]"; 
if ($matches[4]) $formatted .= " $matches[4]"; 

?> 

而且一些示例结果您:

520-555-5542 :: MATCH 
520.555.5542 :: MATCH 
5205555542 :: MATCH 
520 555 5542 :: MATCH 
520) 555-5542 :: FAIL 
(520 555-5542 :: FAIL 
(520)555-5542 :: MATCH 
(520) 555-5542 :: MATCH 
(520) 555 5542 :: MATCH 
520-555.5542 :: MATCH 
520 555-0555 :: MATCH 
(520)5555542 :: MATCH 
520.555-4523 :: MATCH 
19991114444 :: FAIL 
19995554444 :: MATCH 
514 555 1231 :: MATCH 
1 555 555 5555 :: MATCH 
1.555.555.5555 :: MATCH 
1-555-555-5555 :: MATCH 
520-555-5542 ext.123 :: MATCH 
520.555.5542 EXT 123 :: MATCH 
5205555542 Ext. 7712 :: MATCH 
520 555 5542 ext 5 :: MATCH 
520) 555-5542 :: FAIL 
(520 555-5542 :: FAIL 
(520)555-5542 ext .4 :: FAIL 
(512) 555-1234 ext. 123 :: MATCH 
1(555)555-5555 :: MATCH 

你可能会得到很多误报,如果你允许的空间和破折号像你暗示。

+0

对我来说这看起来很好,你已经做了一些非常详尽的测试,这很好。 +1。 – 2011-02-25 15:42:17

+0

非常好!只需评论这个答案的质量。 – XyberICE 2017-09-11 16:54:03

0
<?php 
preg_match_all("/\+?[0-9][\d-\()-\s+]{5,12}[1-9]/", $string, $matches); 
print_r($matches); 
?>