2016-07-05 86 views
7

我正試圖從字符串中提取美國電話號碼。從字符串中提取美國電話號碼

我已經瀏覽了網頁/ SO,但還沒有找到任何適合我需求的解決方案。

說實話,我在網絡編程方面擁有2.5年的經驗,但我在RegEX上很勉強。

這裏是唯一的正則表達式我寫(\d{3}+\-\d{3}+\-\d{4}+)

,但它只能檢測589-845-2889

這裏有電話號碼,我想提取。

589-845-2889 

(589)-845-2889 

589.845.2889 

589 845 2889 

5898452889 

(589) 845 2889 

請告訴我怎樣才能實現這一壯舉在PHP單正則表達式。

編輯:

如果你覺得美國數用戶可以輸入任何其他格式,還提到,爲好,包括在正則表達式爲好。

P.S:

其實我想刮Craiglist上和用戶可能已經張貼在任何可能的形式他們的電話號碼。

+0

589 845-2889'應該匹配嗎? – anubhava

+0

是的,用戶可以輸入他的號碼的任何可能的方式 – Umair

+1

[電話號碼驗證綜合正則表達式]的可能重複(http://stackoverflow.com/questions/123559/a-comprehensive-regex-for-phone-number-驗證) – hugomg

回答

2

在PHP(PCRE)測試,你可以使用基於conditional subpatterns這個表達式:

(\()?\d{3}(?(1)\))[-.\h]?\d{3}[-.\h]?\d{4} 

RegEx Demo

  • (\()?個匹配可選(並捕獲它在組#1
  • (?(1)\))條件模式該匹配閉)僅當組#1不爲空即(存在於左匹配的。
+0

爲什麼它有奇怪的結果? http://sandbox.onlinephpfunctions.com/code/b3b6cf795b8026c85d5c9bbdc04943978e94e8d0 – Umair

+0

我的意思是,它返回2個數組,第1個數組很好,第2個數組是什麼? – Umair

+0

你應該使用'var_dump($ result [0]);'爲你的結果。 [立即查看此演示](http://sandbox.onlinephpfunctions.com/code/1cc85f77cb46becf28711e9162c8ea601d752375) – anubhava

1

最後,它的工作原理:

^(\((\d{3})\)|(\d{3}))[\s\-\.]?\d{3}[\s\-\.]?\d{4} 

在記事本++