找到第一个"无效"字符串中的字符(清理电话号码)

时间:2017-08-26 22:31:53

标签: php split phone-number sanitize

我们正在更新一个系统,其中已将注释添加到包含电话号码的字段中。使用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."我需要进一步复杂化,我可以清理现有数据,以便全部转发。变化是一样的。我们很乐意找到第一个"无效"的位置。字符串中的字符并将其拆分。

一直在寻找,但似乎无法找到适合这种情况的任何东西。感谢任何建议 非常感谢!

2 个答案:

答案 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);

repl.it

上查看它