如何在文本中检测电话号码并替换它们?

11

我知道可以对不良词汇(检查预设单词数组)进行处理,但如何在长文本中检测电话号码? 我正在使用PHP为客户构建网站,他需要避免人们在描述字段中放置他们的手机号码..(参见craigslist等)

此外,他将需要一些审核,但我想知道是否有一种方法可以阻止至少显而易见的方式,比如nnn-nnn-nnnn,不要求阻止其他奇怪的书写方式,如HeiGHT*/four*/nine等...


无论您选择哪个选项,最好保留一个未更改的配置文件,并标记该配置文件。然后,您可以去检查配置文件是否有任何电话号码。如果没有,您可以删除编辑。 - Galen
4个回答

6
欢迎来到正则表达式的世界。基本上您需要使用 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个或更多数字,这可能是不可取的!

获取错误:preg_replace():编译失败:偏移量16处字符类中的范围无效。 - always-a-learner
1
我的正则表达式模式中有一个错别字,我已经更正了 - 现在再试一下。 - Tim Fountain

0

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

我找到了一个可能对你的项目有用的模式:

<?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,您甚至可以在线测试它。这是一个测试正则表达式的好工具。


0

我认为使用过于严格的正则表达式会导致失去大量的检测。

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

因此,你需要一个分析例程在任何消息插入后排队调用,由于计算权重较高。

当隔离出6个或更多位数字后,您可以根据需要替换它们,包括其他数字兄弟节点。无论如何最好保存原始数据,这样您就可以尝试训练检测算法,直到达到最佳效果。

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

关键不在于编写最完美的正则表达式,而在于从统计和动态的角度来解决问题。

记住,在采取行动之后,用户会因此改变他们的插入习惯,所以统计数据会发生变化,您需要学习并更新您的启发式方法。


0

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

Ian

p.s. 对于不良言论,无法实现,正如Scunthorpe的人们所说的那样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接