【问题标题】:how to detect telephone numbers in a text (and replace them)?如何检测文本中的电话号码(并替换它们)?
【发布时间】:2010-09-21 21:56:11
【问题描述】:

我知道它可以用于坏词(检查一组预设词),但如何检测长文本中的电话号码? 我正在为需要避免人们使用描述字段来放置他们的手机号码的客户建立一个 PHP 网站..(请参阅 craigslist 等)

除了他需要一些节制之外,但我想知道是否有办法阻止至少像 nnn-nnn-nnnn 这样明显的东西,而不是要求阻止像 HeiGHT*/four*/nine 等其他奇怪的写作方式......

【问题讨论】:

  • 无论您选择哪个选项,最好保留未修改的配置文件版本,但标记配置文件。然后你可以去检查配置文件是否有任何电话号码。如果没有,您可以删除编辑。

标签: php string


【解决方案1】:

欢迎来到正则表达式的世界。您基本上会想要使用 preg_replace 来查找(某种模式)并用字符串替换。

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

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

这寻找:

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

并替换为字符串 [blocked]。

这涵盖了我能想到的所有明显组合​​:

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

但是它也会删除任何连续的 6 个以上的数字,这可能是不可取的!

【讨论】:

  • gettiing 错误:preg_replace():编译失败:偏移 16 处字符类中的无效范围
  • 我的正则表达式模式中有一个错字,我已更正 - 现在试试。
【解决方案2】:

为此,您必须使用您可能知道的正则表达式。

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

<?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】:

    preg_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找到

    伊恩

    附言正如斯肯索普的人会告诉你的那样,这不能用坏话来做。

    【讨论】:

      【解决方案4】:

      我认为使用太紧的常规 espression 会导致大量检测丢失。

      您应该检查 10 个连续对话中包含超过 5 个数字的部分。

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

      在 6 个或更多数字被隔离后,根据需要替换它们,包括其他 syblings 数字。 在任何情况下都最好保留原始数据,因此您可以尝试训练您的检测算法,直到它以最佳方式运行。

      然后您还可以研究您的用户数据以创建更复杂的启发式方法,例如不区分大小写的数字写成字母、混合、点分隔等......

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

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

      【讨论】:

        猜你喜欢
        • 2013-12-09
        • 2022-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多