我们正在更新一个系统,其中已将注释添加到包含电话号码的字段中。使用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"
有效的电话号码字符将是"+()-0123456789 "
,并且为了使"ext."
我需要进一步复杂化,我可以清理现有数据,以便全部转发。变化是一样的。我们很乐意找到第一个"无效"的位置。字符串中的字符并将其拆分。
一直在寻找,但似乎无法找到适合这种情况的任何东西。感谢任何建议 非常感谢!
答案 0 :(得分:2)
您可以使用如下所示的正则表达式;
^([\+\(\)\-0-9 ]*)([A-Za-z' ]*)$
Group1结果总是编号,Group2结果将是姓名和姓氏 您可以查看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);
答案 1 :(得分:1)
你可以使用正则表达式和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);
上查看它