2011-08-12 54 views
2

在PHP中,我正在搜索某些文本中的電話號碼。 我使用explode()來分割文本的不同部分,使用我正在搜索的城市的區號作爲分隔符。問題在於包含相同數字的電話號碼作爲區號不能很好地返回。查找字符串中的電話號碼

例如:

"foofoo 010-1234567 barbar"分裂成"foofoo ""-1234567 barbar"

"foofoo 010-1230107 barbar"分裂爲"foofoo ""-123""7 barbar"

我可以使用的第一個重建與AREACODE的phonenummer,但第二個不順心,當然...

我想我需要一個正則表達式的文本以某種機制來分裂不是分割成短字符串,而不是explode(),但我不知道該怎麼做。

任何想法或更好的方式來搜索文本中的phonenumbers?

UPDATE: 格式不相符,所以尋找連字符是無解的。一些電話號碼在區號和號碼之間有空格,一些號碼有掛鉤,有些沒有任何號碼等。荷蘭語號碼的地區碼有2,3或4個數字,通常是10個號碼。

+0

不要使用數據作爲'explode'分隔符;使用分隔符作爲分隔符。 –

+2

這裏你更廣泛的目標是什麼?如果你只是想提取電話號碼,或第一/第三個標記,那麼這是微不足道的,有一百萬種方法來做到這一點。 –

+0

相關信息:[使用preg_replace在PHP字符串中查找電話號碼的最終方法](http://stackoverflow.com/q/10141295/55075) – kenorb

回答

6

要查找電話號碼,如:

  • 010-1234010
  • 010-010-0100

Tr y這:

$text = 'foofoo 010-1234010 barbar 010 1234010 foofoo '; 
$text .= ' 010 123 4010 barbar 01foofoo 010-010-0100'; 

$matches = array(); 

// returns all results in array $matches 
preg_match_all('/[0-9]{3}[\-][0-9]{6}|[0-9]{3}[\s][0-9]{6}|[0-9]{3}[\s][0-9]{3}[\s][0-9]{4}|[0-9]{9}|[0-9]{3}[\-][0-9]{3}[\-][0-9]{4}/', $text, $matches); 
$matches = $matches[0]; 

var_dump($matches); 
+0

如果您需要查找其他類型的電話號碼,請添加更多正則表達式。語法很簡單。 [0-9] {3}匹配3個數字(替換3 ...) [\ s]匹配空格 [\ - ]匹配短劃線。 |分隔不同的「查詢」(不能想到這個詞) 看看我的搜索字符串,並從那裏去。 – sammoore

+0

那麼,它看起來很有希望,但它現在只返回9個數字。 – Dylan

+0

9個數字?如果您的意思是它只返回一個電話號碼,請刪除$ matches = $ matches [0]行。這是我的系統所需要的。否則,不確定你的意思,詳細說明? – sammoore

0

如果您刪除所有非數字字符,您將只剩下電話號碼。如果你願意的話,你可以把這個字符串解析成###-###-####

$phone = preg_replace('/\D/', '', 'Some test with 123-456-7890 that phone number'); 
//$phone is now 1234567890 
echo substr($phone, 0, 3);//123 
echo subsr($phone, 3, 3);//456 
echo substr($phone, 6);//7890 

不知道這是你在找什麼或不是。

+0

恐怕郵政編碼也會轉換爲電話號碼。 – Dylan

+0

是的。我想我沒有考慮到這一點。 – Kyle

+2

@凱爾,你爲什麼?沒有提及涉及該問題的郵政編碼。 – salathe

2

您可以使用正則表達式來匹配電話號碼。有許多方法可以對這隻特定的貓進行剝皮(在這裏可能有很多相同的問題),一個超基本的例子可能如下所示。

$subject = "foofoo 010-1230107 barbar 010-1234567"; 
preg_match_all('/\b010-\d+/', $subject, $matches); 
$numbers = $matches[0]; 
print_r($numbers); 

以上將輸出$numbers數組的內容。

Array 
(
    [0] => 010-1230107 
    [1] => 010-1234567 
) 
+0

太糟糕了,並非文中的所有電話號碼都有連字符... – Dylan

+3

太糟糕了,我們在這裏回答問題,而不是閱讀頭腦。創建正則表達式需要一個(通常)嚴格的規則集:「匹配電話號碼」是不夠用的,請考慮您希望匹配的所有電話格式,然後相應地編寫一個正則表達式。我會建議你自己**這樣做,以避免不可避免的小時/天到達和來回,而無需到達您可以複製/粘貼的代碼片段。 – salathe

+0

我並不特意要求一個正則表達式,我只是建議這可能是解決方案之一。自己去做也是一種選擇,但由於我不是這方面的專家,而且我認爲這是一個有用的問題,所以我決定將它發佈在這裏... – Dylan