【问题标题】:Parse phone numbers in strings using PHP使用 PHP 解析字符串中的电话号码
【发布时间】:2011-01-06 14:28:04
【问题描述】:

我需要解析字符串中的电话号码,每个字符串可以有多个号码。我的问题是电话号码可能是这样的:

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

我该如何处理呢?如果您有一些线索,将不胜感激。

最好的问候,


更新1:

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

$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

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

最好的问候,


更新2:

我用另一种字符串进行了测试,但失败了。如果有人对此有任何线索,我会发布示例。

$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 解析为单独的数字。

这有什么线索吗?

最好的问候,

【问题讨论】:

  • 你要解析成什么格式?
  • 您好,感谢您的回复。我想解析成“912343267”。有可能的?最好的问候,
  • 你能举出整个字符串的例子吗?您能否澄清一下字符串中是否包含其他字符(例如句子中的电话号码......并且同一字符串中可能有多个电话号码等)或者整个字符串是否是一个数字,但不同格式的可能性?
  • @Crayon Violent,感谢您的回复。我已经更新了这个问题。如果你能提供一些线索。最好的问候,
  • 好的,根据您的更新...如果您的字符串看起来确实如此...没有可靠的方法可以从中解析电话号码。相反,您必须后退一步,重新开始获取和/或存储字符串的方式。

标签: php parsing phone-number


【解决方案1】:
$string = preg_replace('~[^0-9]~','',$string);

【讨论】:

  • 问题是他可以在一个字符串中有多个数字。您的代码会将“+34 912343267 或 +34 91 234 32 67”转换为“3491234326734912343267”,这不好 :)
  • 根据他的后续例子,我把“多于一个数字”的意思是整个字符串是一个数字,但可能有多个格式。
【解决方案2】:

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

$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...正如我之前提到的,您需要退后一步,重做您获取/存储的方式首先是字符串。

【讨论】:

  • 您好,感谢您的回复。我已经用这个字符串“$phone_list = '
    A Front para





    -Apoio;
    - Criação;
    -Campanhas;
    -Promoções


    CONDIÇÕES:

    当地特拉巴略:Es
    Folgas:Mistas


    订购 500 欧元



    最小:

    - Conhecimentos;
    - Ensino ;
    -INGLÊS.



    候选人:
    email@ffff.es
    218559372 | 927 555 929 |
    RH
    Rua C. Sal. 40
    1000-000 Lisboa


    ';"并且不返回预期。有什么线索吗?最佳注册
  • 在您的第一次更新中,您展示了您声称是“真实环境”的内容……现在您展示了一些完全不同的东西。您可以通过显示适当的上下文来避免这种来回...如果这一次真的是您真正的真实内容,那么我要说除非您可以建立一组电话号码,否则您无法可靠地解析所有电话号码确定他们将从哪里开始的可靠规则。数字是否总是出现在某些 html 标签之间?哪个?还有什么可能出现在那里吗?模式匹配可靠工作的唯一方法是
  • ...是否有可靠的模式可以匹配。您没有提供任何证据表明存在可匹配的可靠模式,而且您不断制作不同的内容示例也无济于事。
  • 【解决方案3】:

    如果只是您想要的字符串中的数字,请使用 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);
        }
    }
    

    您的电话号码格式为 $numbers。

    【讨论】:

    • 嗨,我已经测试了代码并且工作正常,我将尝试使用子字符串来仅获取 9 个字符的数字。最好的问候,
    • @André 我已更新代码以适用于您的最新版本。
    【解决方案4】:

    那么,您更新后的新示例内容这次真的是真实的真实内容吗?为清楚起见进行了细分:

    $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 />';
    

    为了从中刮出数字,您必须有一种可靠的方法来找到标记数字所在位置的某种锚点或分隔符。例如,如果整个字符串和 html 代码本身都不会改变,您可以例如查找第 7 和第 6 个到最后一个 &lt;br /&gt; 标记之间的内容,然后从那里开始......

    ...从那里看来,如果您有多个电话号码,它们是用竖线分隔的,这是正确的吗?你为什么一开始不说呢?

    我发布这篇文章只是为了尝试向您解释正则表达式的工作原理:为了可靠地匹配模式,必须首先确定格式中的可靠模式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-01
      • 2019-12-06
      • 1970-01-01
      • 2012-06-19
      • 1970-01-01
      • 2015-12-14
      相关资源
      最近更新 更多