2015-02-06 55 views
0

是否有功能或簡單的方法將電話號碼剝離爲特定格式?剝離電話號碼(移動)

輸入可以是數字(移動,不同的國家代碼)

也許

+4917112345678 
+49171/12345678 
0049171 12345678 

或也許來自另一個國家

004312345678 
+44... 

Im做一個

$mobile_new = preg_replace("/[^0-9]/","",$mobile); 

至 因爲我需要的格式是49171(開始時不帶+或00),但是如果先插入00或者有人使用+49(0)171或者輸入a 0171(需要是49171.

所以第一個數字總是需要農村沒有+/00和之間沒有任何(0)之間。

有人可以給我一個關於如何解決這個問題的建議嗎?

+0

如果用戶輸入'0171'.....或其他任何不開始與'+'或'00'你只能猜測countryspecific前綴是什麼。或者你想讓'49'成爲這種情況下的默認值? – 2015-02-06 10:21:32

+0

那就對了。我想爲CC添加一個下拉列表,我認爲。 – Sili 2015-02-06 19:53:42

回答

0

您可以使用

(?:^(?:00|\+|\+\d{2}))|\/|\s|\(\d\) 

匹配大部分的情況下,只需用什麼替代它們。例如:

$mobile = "+4917112345678"; 
$mobile_new = preg_replace("/(?:^(?:00|\+|\+\d{2}))|\/|\s|\(\d\)/","",$mobile); 
echo $mobile_new; 
//output: 4917112345678 

regex101 Demo

說明:

我正在使用的OR這裏,匹配您的每一個案例一個接一個:

  1. (?:^(?:00|\+|\+\d{2}))比賽00++,然後在字符串的開頭加上兩個數字
  2. \/匹配的/字符串
  3. \s在任何地方whitspace在字符串中的任何地方匹配(它在regex101演示換行符比賽,但我想你匹配自己的每個號碼)
  4. \(\d\)一個號碼匹配括在方括號中的字符串

不受本正則表達式的唯一情況是任何地方輸入格式01712345678,因爲你只能採取猜測該國特定的前綴可以是什麼。如果你希望它是49默認情況下,則只需更換每個輸入始發於一個049

$mobile = "01712345678"; 
$mobile_new = preg_replace("/^0/","49",$mobile); 
echo $mobile_new; 
//output: 491712345678 
+0

工作正常!而你的權利..腳本需要cc才能正常工作,所以如果有人忘記cc,不需要採取任何行動:) – Sili 2015-02-06 19:55:33

0

這種模式(49)\(?([0-9]{3})[\)\s\/]?([0-9]{8})將在三組分成數:

  • 49 - 國家代碼
  • 3位 - 區號
  • 8位 - 數

比賽結束後,你可以建造乾淨的數字只是連接他們\1\2\3

演示:https://regex101.com/r/tE5iY3/1

如果這不適合你,那麼請解釋更準確地說,你想測試輸入和預期的輸出是什麼。

0

我建議考慮看看LibPhoneNumber由谷歌和它的PHP接口。 它支持多種格式和國家,並且維護良好。最好不要自己弄清楚。

https://github.com/giggsey/libphonenumber-for-php

$phoneUtil = \libphonenumber\PhoneNumberUtil::getInstance(); 
$usNumberProto = $phoneUtil->parse("+1 650 253 0000", "US"); 
+0

看起來不錯!我會在稍後的更新中實現它!謝謝! – Sili 2015-02-06 19:56:16