在PHP中将电话号码和扩展名与格式不良的数据分离
我有一大堆电话号码串。我需要把分机号码和分机号码分开。然而,格式显然到处都是。如何在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)
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);
?>