2017-08-26 145 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

相关问题