2011-06-28 90 views
1

我使用preg_match_all()抓住從頁面的電話號碼,但我得到的錯誤preg_match_all() [function.preg-match-all]: Compilation failed: nothing to repeat at offset 20PHP的正則表達式(XXX)XXX-XXXX

我的PHP代碼:

preg_match_all(
     '/<div class="phone">(*.?)<\/div>/s', 
     $html, 
     $array, 
     PREG_SET_ORDER 
); 

代碼到正則表達式:

<div class="phone"> 
    (617) 495-5758 
</div> 

爲什麼在電話號碼犯規(*.?)工作,和h我可以編輯代碼以使其正確處理電話號碼嗎?

+0

[提取電話號碼]的可能重複(http://stackoverflow.com/questions/3982186/extracting-phone-numbers) – coreyward

+0

我假設你的網站是美國專用,但爲了防止您計劃在其他地方使用此代碼,請注意,世界其他地區不會像這樣格式化他們的電話號碼。 – Spudley

+0

此外,這是在'preg_match' [文檔](http://us3.php.net/manual/en/function.preg-match.php#90503)的評論。你應該知道足夠使它適用於'preg_match_all'。 – coreyward

回答

3

*表示「重複前面的原子」。但它遵循(這是一個特殊的字符,而不是一個原子。

你也許是指.*?(任何數字的任何字符,非貪婪)?

1

嘗試:

'/ < DIV類= 「手機」 >([^ <] +)</DIV >/S'

-1

因爲它應該是(.*?)和不(*.?)。這是一個更好的正則表達式:

preg_match_all('~<div class="phone">\s*(.+?)\s*</div>~s', $html, $array, PREG_SET_ORDER); 
+0

爲什麼downvote? –

1

(*.?)應該是(.*?)

preg_match_all(
     '/<div class="phone">(.*?)<\/div>/s', 
     $html, 
     $array, 
     PREG_SET_ORDER 
); 
1

只是讀this article有一天,並添加註釋下的第一個例子具體運行的正則表達式的電話號碼過濾器。希望它可以幫助

1

它不匹配,因爲有行遊:

<div class="phone"> <!-- break --> 
    (617) 495-5758 <!-- break --> 
</div> 

要解決,而不是僅僅/s這種使用/sm。您的regEx也有錯誤,ti應該是.*而不是*.

看到這裏的工作例如:http://www.rubular.com/r/94bgLmDzac