2013-06-24 87 views
2

我有我的正則表達式的一個小問題,我用它來從強PHP的正則表達式,從字符串中提取電話號碼?

<?php 
$output = "here 718-838-3586 there 1052202932 asdas dasdasd 800-308-4653 dasdasdasd 866-641-6949800-871-0999"; 
preg_match_all('/\b[0-9]{3}\s*[-]?\s*[0-9]{3}\s*[-]?\s*[0-9]{4}\b/',$output,$matches); 
echo '<pre>'; 
print_r($matches[0]); 
?> 

輸出

Array 
(
      [0] => 718-838-3586 
      [1] => 1052202932 
      [2] => 800-308-4653 
      [3] => 866-641-6949 
      [4] => 800-871-0999 

) 

這項工作很好提取電話號碼,但它返回1052202932作爲結果之一,我不要不需要。
實際上我不知道我的模式中缺少的部分在哪裏。

+0

*您的*模式?你寫了嗎?然後只是讓破折號不再可選。 – mario

回答

2

?正在使-可選。如果你希望它是必需的,你可以刪除?,這將需要它。此外,[-]相當於-所以我擺脫了不必要的字符類:

preg_match_all('/\b[0-9]{3}\s*-\s*[0-9]{3}\s*-\s*[0-9]{4}\b/',$output,$matches); 

您還可以\d取代所有的[0-9]的進一步縮短了一點:

preg_match_all('/\b\d{3}\s*-\s*\d{3}\s*-\s*\d{4}\b/',$output,$matches); 
2

在正則表達式的方法{0,1},你到底需要1個occurence的 ' - ' 在你的模式

preg_match_all('/\b[0-9]{3}\s*-\s*[0-9]{3}\s*-\s*[0-9]{4}\b/',$output,$matches); 

對於每個[-]後更多信息http://www.php.net/manual/en/regexp.reference.repetition.php

+1

請解釋倒票 –

+0

'+'與'{1}'不同,它與'{1,}'相同。 (所以這將匹配'123 ---- 456 ---- 7890') –

+0

那裏固定,輕微的錯誤,值得投票不會覺得 –

0

使用本正則表達式\d{3}-\d{3}-\d{4}