代码之家  ›  专栏  ›  技术社区  ›  Francesco

如何检测文本中的电话号码(并替换)?

  •  11
  • Francesco  · 技术社区  · 15 年前

    我知道这可以用来对付坏话(检查一系列预设单词),但如何在长文本中检测电话号码呢? 我正在用PHP为一个需要避免人们使用描述字段输入手机号码的客户建立一个网站。。(参见craigslist等)

    除此之外,他还需要一些节制,但我想知道是否有办法阻止最明显的 nnn-nnn-nnnn ,而不是要求阻止其他奇怪的写作方式,比如 HeiGHT*/four*/nine

    4 回复  |  直到 15 年前
        1
  •  6
  •   Tim Fountain    8 年前

    欢迎来到正则表达式的世界。您基本上需要使用preg\u replace来查找(一些模式)并替换为字符串。

    这里有一些东西可以让你开始:

    $text = preg_replace('/\+?[0-9][0-9()\-\s+]{4,20}[0-9]/', '[blocked]', $text);
    

    这将查找:

    加号(可选),后跟数字,后跟4-20个数字、括号、破折号或空格,后跟数字

    并替换为字符串[已阻止]。

    这抓住了我能想到的所有明显的组合:

    012345 123123
    +44 1234 123123
    +44(0)123 123123
    0123456789
    Placename 123456 (although this one will leave 'Placename')
    

    然而,它也会去掉任何连续的6+数字,这可能是不可取的!

        2
  •  0
  •   João Louros    15 年前

    要做到这一点,您可能知道,必须使用正则表达式。

    我发现这种模式可能对您的项目有用:

    <?php
      preg_match("/(^(([\+]\d{1,3})?[ \.-]?[\(]?\d{3}[\)]?)?[ \.-]?\d{3}[ \.-]?\d{4}$)/", $yourText, $matches);
      //matches variable will contain the array of matched strings
    ?>   
    

    有关此模式的更多信息,请参见此处 http://gskinner.com/RegExr/?2rirv 你甚至可以在线测试它。这是测试正则表达式的一个很好的工具。

        3
  •  0
  •   Ian    15 年前

    如果在主题中找到模式,preg\u match($pattern,$subject)将返回1(true),否则返回0(false)。

    与您给出的示例匹配的模式可能是“/\d{3}-\d{3}\d{4}/”

    然而,无论你为你的模式选择什么,都会受到误报和漏报的影响。

    您还可以考虑在号码旁边查找mob、cell或tel等词。

    php模式匹配的填充详细信息可以在 http://www.php.net/manual/en/reference.pcre.pattern.syntax.php

    伊恩

    p、 正如斯肯索普的人会告诉你的那样,这不能用于恶语。

        4
  •  0
  •   Michele Carino    9 年前

    我认为使用过紧的正则表达式会导致大量检测丢失。

    您应该检查10个包含5个以上数字的连续聊天符的部分。

    因此,由于计算权重的原因,您将有一个analisys例程排队等待在任何消息插入后调用。

    在分离出6个或更多数字后,根据您的喜好替换它们,包括其他合成数字。 无论如何,最好保留原始数据,这样您就可以尝试并训练检测算法,直到它以最佳方式工作。

    然后,您还可以研究您的用户数据以创建更复杂的euristics,例如不区分大小写的数字,如字母、混合、点分隔等。。。

    这不是要写出最完美的正则表达式,而是要从统计和逻辑上解决问题。

    请记住,在您采取行动后,用户将改变其插入习惯,因此统计数据将发生变化,您需要学习和更新您的euristics。

    推荐文章