2015-10-16 198 views
-1

我正在嘗試使用正則表達式從字符串中挑選電話號碼,其中電話號碼的格式可能只是任何內容,或者可能沒有電話數字。例如:從字符串中挑選電話號碼(正則表達式)

$string = 'My phone number is +34 961 123456.'; 
$string = 'My phone number is +34 (961) 123456.'; 
$string = 'My phone number is 961-123456.'; 
$string = 'My phone number is +34.961.12.34.56.'; 
$string = 'Product A costs €100.00 and Product B costs €134.15.'; 

到目前爲止,我得

$number = preg_replace("/[^0-9\/\+\.\-\s]+/", "", $string); 
$number = preg_replace("/[^0-9]+/", "", $number); 
if (strlen($number)>8) { 
/* It's a phone number, so do something with it */ 
} 

這適用於挑選出所有的,我已經嘗試了不同的電話號碼格式,但它也把價格一起,並假定他們也是一個電話號碼。

看來我的問題是,一個人可以很容易區分單詞和電話號碼中間的空格之間的空間,但我該如何讓電腦做到這一點?有沒有辦法可以替換數字前後的空格,但保留其他空格不變?有沒有其他的方法來整理呢?

+0

「重複」問題的答案僅適用於輸入中的所有數字都屬於電話號碼 – alexis

+0

而不是「+」的情況。使用量詞應該有助於「{n,}」(n或更多次) –

回答

1

看起來像是想要9到12位數字的序列,除了空格,括號,句點或破折號之外,它們之間沒有任何內容;並可能在+之前。試試這個:

這並不完美,因爲尾隨的標點符號(如下面所有示例中的句點)將包含在匹配的字符串中。後處理結果的列表,修剪:

preg_replace("/[-. ]+$/", "", $results); 

或者,你可以通過刪除結果中所有非數字規範收集電話號碼,僅保留的數字,可能最初的「+」:

preg_replace("/[-.()]/", "", $results); 
+0

我想你對了。我試過你的代碼,它會拋出一個錯誤「preg_match_all():分隔符不能是字母數字或反斜槓」。不幸的是,我不明白你的synta足夠試圖去調試它。 – TrapezeArtist

+0

糟糕,我忘了在正則表達式中放置斜槓!固定。 – alexis

+0

解決了它。我放入了斜線,它工作。如果數字出現在句子末尾,我已經處於完全停止問題的頂部:用rtrim將其刪除並放回最後。謝謝亞歷克西斯。 – TrapezeArtist

1

恐怕你不會喜歡它。我得到的正則表達式是這樣的:

(\+?[0-9]?[0-9]?[[:blank:],\.]?[0-9][0-9][0-9][[:blank:],\.]?[0-9][0-9][[:blank:],\.]?[0-9][0-9][[:blank:],\.]?[0-9][0-9]) 

說明:

(<-- is for "grouping" and get the regular expression, probably not needed here 
\+? <-- optional plus sign 
[0-9]?[0-9]? <-- optional prefix code 
[[:blank:],\.]? <-- optional space (or comma or dot) between the prefix code and the rest of the number 
[0-9][0-9][0-9][[:blank:],\.]? <-- optional province code 
[0-9][0-9][[:blank:],\.]?[0-9][0-9][[:blank:],\.]?[0-9][0-9] <-- number, composed by six numbers 

因爲這些例子是西班牙的電話號碼,是不是???

在這種情況下,您已經忘記給我們其他格式的例子,例如「91 123 45 67」,這可能會使解決方案更復雜。

對於這些情況,我謙虛地認爲這是製作一個小功能的最佳解決方案。正則表達式太複雜,無法成爲可維護的解決方案。

+0

他們可以是任何國家。我只用+34作爲例子。這就是爲什麼我試圖隔離只包含數字和有時包含在電話號碼中的各種字符的任何部分。然後,如果該部分字符串比價格更長,則它必須是電話號碼。 – TrapezeArtist

+0

法國電話號碼的格式爲0X XX XX XX XX。英國的格式可以有10位,9位或7位數字。我認爲一個「全球」解決方案不能輕易實現。 https://en.wikipedia.org/wiki/Telephone_numbers_in_France https://en.wikipedia.org/wiki/Telephone_numbers_in_the_United_Kingdom#Format –

+0

@RaulLuna一個微小的除了您的評論:英國的電話號碼*在歐洲大陸,分爲三個(5,3,3)的十*或*十*個數字,他們配對(2,2,2,2,2)。 – Martin