使用PHP解析字符串中的电话号码

时间:2011-01-06 14:28:04

标签: php parsing phone-number

我需要解析字符串中的电话号码,每个字符串可能有多个号码。我的问题是电话号码可能如下所示:

912343267
91 234 32 67
912 343 267
34912343267
+34912343267
0034912343267
+34 912343267
+34 91 234 32 67
+34 912 343 267

我怎么可能处理这个?如果你有一些线索,将不胜感激。

最诚挚的问候,


Updade1:

我正在测试代码,就像在真实环境中一样:

$phone_list = "912343267 91 fgf ddf 234 32 67 dfffgg g 912 343 267 ffd dff fff 34912343267 ddssf f +34912343267 f fdd d 0034912343267 derd df e +34 912343267 fdd ff +34 91 234 32 67 ffd vv ff f +34 912 343 267";
$string = preg_replace('~[^0-9]~','',$phone_list);
echo $string;

给我:

91234326791234326791234326734912343267349123432670034912343267349123432673491234326734912343267

可以输出数组中的数字吗?

最诚挚的问候,


UPDATE2:

我已经测试了另一种字符串但是失败了。如果有人对此有任何线索,我会发布这个例子。

$phone_list = '</div>A Front para<br /><br /><br /><br /><br /><br />-Apoio;<br />-Criação;<br />-Campanhas;<br />-Promoções<br /><br /><br />CONDIÇÕES:<br /><br />Local de Trabalho: Es<br />Folgas: Mistas<br /><br /><br /><br />ordem 500€<br /><br /><br /><br />Mínimos:<br /><br />- Conhecimentos;<br />- Ensino ;<br />-INGLÊS.<br /><br /><br /><br />Candidaturas: <br />email@ffff.es<br />218559372 | 927 555 929 | <br />RH<br />Rua C. Sal. 40<br />1000-000 Lisboa<br /><br /><br />';
$phone_list = preg_replace('~[^0-9a-z]~i','',$phone_list);
$phone_list = preg_split('~[a-z]+~i',$phone_list);
print_r($phone_list);

代码返回:

Array ( [0] => [1] => 500 [2] => 218559372927555929 [3] => 40 [4] => 1000000 [5] => ) 

代码应解析:218559372和927555929作为单独的数字。

有关此的任何线索吗?

最诚挚的问候,

4 个答案:

答案 0 :(得分:2)

$string = preg_replace('~[^0-9]~','',$string);

答案 1 :(得分:0)

如果只是字符串中的数字,请使用preg_split()创建仅包含数字的数组,然后使用以下函数,该函数具有国家/地区代码的可选参数:

function formatPhone($phone, $country_code = 34) {
    $pattern = '/^(00|\+)?' . $country_code . '\s?/';
    $phone = preg_replace($pattern, '', $phone);
    return str_replace(' ', '', $phone);
}
$list = preg_split('/\s([^\d+]+)/', $phone_list);
$numbers = array();
foreach ($list as $number) {
    $numbers[] = formatPhone($number);
}

$ numbers是格式化数字的数组。

以下内容应处理您的Update 2代码:

$country_code = 34;
$pattern = '/(?:\+|00)?(?:' . $country-code . ')?(\d[\d\s]{9,14})/';
preg_match_all($pattern, $phone_list, $matches);
$numbers = array();
if (isset($matches[1])) {
    foreach ($matches[1] as $match) {
        $numbers[] = str_replace(' ', '', $match);
    }
}

您的格式化电话号码是$ number。

答案 2 :(得分:0)

根据您的更新中的示例字符串,这可能是您最可靠的解决方案......但它有一个主要的警告,即只有当您的字符串中的所有数字都是电话号码的一部分时它才会起作用(没有其他随机数字不属于电话号码)...

$phone_list = "912343267 91 fgf ddf 234 32 67 dfffgg g 912 343 267 ffd dff fff 34912343267 ddssf f +34912343267 f fdd d 0034912343267 derd df e +34 912343267 fdd ff +34 91 234 32 67 ffd vv ff f +34 912 343 267";
$phone_list = preg_replace('~[^0-9a-z]~i','',$phone_list);
$phone_list = preg_split('~[a-z]+~i',$phone_list);

如果你的字符串中还有其他数字不是电话号码......那么你就像SoL ......正如我之前提到的那样,你需要退后一步并重做你如何获取/存储首先是字符串。

答案 3 :(得分:0)