2017-08-26 69 views
1

我們正在更新一個系統,其中的筆記被添加到包含電話號碼的字段中。使用PHP,我們試圖清理這些字段並將它們分成兩部分。一個用於電話號碼,另一個用於說明。這個號碼總是第一個,後面是註釋。查找字符串中的第一個「無效」字符(清除電話號碼)

我們並不過分關注產生的電話號碼的確切格式。當用戶更新他們的個人資料時,他們可能被迫清理它們。這些數字是美國格式。

幾個例子。我想可能有其他變化:

"(123) 456-7890 Betty's cell" 
becomes 
"(123) 456-7890" and "Betty's cell" 

"123-456-7890 Betty's cell 
becomes 
"123-456-7890" and "Betty's cell" 

"456-7890 Betty's cell 
becomes 
"456-7890" and "Betty's cell" 

"456-7890 ext. 123 Betty's cell 
becomes 
"456-7890 ext. 123" and "Betty's cell" 

有效的電話號碼字符可"+()-"和進一步的東西,我們需要允許"ext."我可以清理現有的數據,因此所有分機複雜化。變化是相同的。我們很樂意在字符串中找到第一個「無效」字符的位置並將其分割。

一直在尋找,但似乎無法找到任何適合這種情況的東西。感謝任何建議。
非常感謝!

回答

1

你可以使用像下面這樣的正則表達式;

^([\+\(\)\-0-9 ]*)([A-Za-z' ]*)$ 

組別1結果總是號和第2組的結果將是名字和姓氏 您可以檢查https://regex101.com/r/PhEQNH/1/

$re = '/^([\+\(\)\-0-9 ]*)([A-Za-z\' ]*)$/'; 
$str = '123-456-7890 Betty\'s cell 
'; 

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0); 

// Print the entire match result 
var_dump($matches); 
+0

T hank怪傑博士。除了有擴展名「ext。」的情況外,這種方法是有效的。在字符串中。是否有可能擴展正則表達式以包含「分機」? – ZeroGravity

+0

如果你舉例說明,我可以重寫代碼... –

+0

從@trincot和你的代碼的正則表達式我有它的工作!謝謝! – ZeroGravity

0

你可以用正則表達式和preg_match做到這一點:

function splitPhoneNotes($s) { 
    preg_match("~^([\d() +-]+(?:ext\.[\d() -]+)?)(.*)~", $s, $res); 
    return [ 
     "phone" => trim($res[1]), 
     "note" => trim($res[2]) 
    ]; 
} 

// Sample inputs 
$arr = [ 
    "(123) 456-7890 Betty's cell", 
    "123-456-7890 Betty's cell", 
    "456-7890 Betty's cell", 
    "+1 (324) 456-7890 ext. 33 Betty's cell", 
]; 

// Apply the function to each of the inputs 
$res = array_map('splitPhoneNotes', $arr); 

// Results 
print_r($res); 

看到它運行在repl.it

+0

謝謝!使用Dr Geek和您的正則表達式的代碼,我有它的工作。希望我能做出兩個解決方案。兩人都工作。 :) – ZeroGravity

+0

不客氣!一旦你有足夠的聲譽,你可以upvote ;-) – trincot

+0

我upvoted你們兩個。我認爲我收到的信息是記錄,但不顯示或類似 – ZeroGravity

相關問題