2011-02-24 113 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); 
?>