在PHP中将电话号码和扩展名与格式不良的数据分离

在PHP中将电话号码和扩展名与格式不良的数据分离,php,regex,Php,Regex,我有一大堆电话号码串。我需要把分机号码和分机号码分开。然而,格式显然到处都是。如何在PHP中最好地实现这一点 555-555-5555 ext 230 555-555-5555 ex 230 555-555-5555 x 230 555-555-5555 ext. 230 555-555-5555 ext230 555-555-5555 x230 555-555-5555 ext # 230` 我试着使用正则表达式,但我没能想出一个匹配上面所有内容的模式 电话号码本身也不是很好。 从(555)

我有一大堆电话号码串。我需要把分机号码和分机号码分开。然而,格式显然到处都是。如何在PHP中最好地实现这一点

555-555-5555 ext 230
555-555-5555 ex 230
555-555-5555 x 230
555-555-5555 ext. 230
555-555-5555 ext230
555-555-5555 x230
555-555-5555 ext # 230`
我试着使用正则表达式,但我没能想出一个匹配上面所有内容的模式

电话号码本身也不是很好。 从
(555)555-555-5555
55555-555-5555
的所有内容。哦,有些记录有多个数字,它们之间用单词分隔,如
Mobile:
Cell:
,或换行符:D。但是,这个问题是另一个问题

此外,扩展名并不总是3个数字。可能是2比4

我的预期结果大致如下:

$array = [
    'phone' => '555-555-5555',
    'ext' => '123'
];

考虑到电话号码也不是f-ed。您可以这样做:

$array = array (
    '555-555-5555 ext 230',
    '555-555-5555 ex 230',
    '555-555-5555 x 230',
    '555-555-5555 ext. 230',
    '555-555-5555 ext230',
    '555-555-5555 x230',
    '555-555-5555 ext # 230`',
);

$data = array();
foreach ($array as $val)
{
    while (!is_numeric(substr($val,-1))) {
        $val = substr_replace($val ,"", -1);
    }
    $data[] = array( 
            'num' => substr($val, 0, 12), 
            'ext' => substr($val, -3)
        );
}

echo "<pre>"; print_r($data);
$array=array(
“555-555-5555分机230”,
“555-555-5555 ex230”,
“555-555-5555 x 230”,
“555-555-5555分机230”,
“555-555-5555 ext230”,
“555-555-5555 x230”,
“555-555-5555分机#230”,
);
$data=array();
foreach($val形式的数组)
{
而(!是数值的(substr($val,-1))){
$val=substr_replace($val,“,-1);
}
$data[]=数组(
“num”=>substr($val,0,12),
'ext'=>substr($val,-3)
);
}
回声“;打印(数据);
试试这个

<?php
$number = "555-555-5555 x 230";

preg_match_all('!\d+!', $number, $matches);

for($x=0;$x<count($matches);$x++){

        for($y=0;$y<count($matches[$x]);$y++){
            if($y == (count($matches[$x]) - 1)){
                    $result[]= "#".$matches[$x][$y];
                }else{
                    $result[] = $matches[$x][$y];
                }
        }
}

    for($xy=0;$xy<count($result);$xy++){

        if($xy == count($result) - 1 ){
            $data['ext'][] = $result[$xy];
        }else{
            $data['number'][] = $result[$xy];
        }

    }

    $num = implode("-", $data['number']);
    $ext = implode("", str_replace("#","",$data['ext']));

    $final = array("number" => $num, "ext" => $ext);
    echo "<pre>";print_r($final);

?>

结果555-555-5555-230。顺便问一下,你期望的结果是什么

更新。我不知道这是不是最好的办法,但请试一试



您的输出是什么?您能假设输入数据中的所有电话号码都是
555-555-5555
格式吗?是否会有其他格式,如
(555)555-5555
?@Raptor。然而,目前我主要是因为分机问题而耽误了时间。我觉得样本不够好,无法尝试。我敢打赌,电话号码中总会出现一些东西,“因为有一个项目是……,所以不起作用”。实际样本(电话号码当然可以屏蔽)。如果你给我们10个项目与所有相同的模式,这是我们将给你的答案。我可以回答说在第一个空间爆炸。对吗?在您的示例数据中,它是。这说明答案正确吗?这将是一个永无止境的兔子洞。你将一直添加到它,就像你已经在同一个记录中添加了新的线路和多个电话一样。在我的问题中添加了预期结果示例。我很抱歉。@Gurnzbot您可以查看ACD的答案。考虑到我的例子不好,这将起作用,但电话号码可能并不总是采用这种格式。扩展名不一定总是3位数。在形成问题时,100%是我的错。
<?php
$number = "555-555-5555 x 230";

preg_match_all('!\d+!', $number, $matches);

for($x=0;$x<count($matches);$x++){

        for($y=0;$y<count($matches[$x]);$y++){
            if($y == (count($matches[$x]) - 1)){
                    $result[]= "#".$matches[$x][$y];
                }else{
                    $result[] = $matches[$x][$y];
                }
        }
}

    for($xy=0;$xy<count($result);$xy++){

        if($xy == count($result) - 1 ){
            $data['ext'][] = $result[$xy];
        }else{
            $data['number'][] = $result[$xy];
        }

    }

    $num = implode("-", $data['number']);
    $ext = implode("", str_replace("#","",$data['ext']));

    $final = array("number" => $num, "ext" => $ext);
    echo "<pre>";print_r($final);

?>