我知道可以对不良词汇(检查预设单词数组)进行处理,但如何在长文本中检测电话号码? 我正在使用PHP为客户构建网站,他需要避免人们在描述字段中放置他们的手机号码..(参见craigslist等)
此外,他将需要一些审核,但我想知道是否有一种方法可以阻止至少显而易见的方式,比如nnn-nnn-nnnn
,不要求阻止其他奇怪的书写方式,如HeiGHT*/four*/nine
等...
我知道可以对不良词汇(检查预设单词数组)进行处理,但如何在长文本中检测电话号码? 我正在使用PHP为客户构建网站,他需要避免人们在描述字段中放置他们的手机号码..(参见craigslist等)
此外,他将需要一些审核,但我想知道是否有一种方法可以阻止至少显而易见的方式,比如nnn-nnn-nnnn
,不要求阻止其他奇怪的书写方式,如HeiGHT*/four*/nine
等...
$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')
要做到这一点,你必须使用正则表达式,你可能已经知道了。
我找到了一个可能对你的项目有用的模式:
<?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,您甚至可以在线测试它。这是一个测试正则表达式的好工具。
我认为使用过于严格的正则表达式会导致失去大量的检测。
你应该检查连续10个字符中包含超过5个数字的部分。
因此,你需要一个分析例程在任何消息插入后排队调用,由于计算权重较高。
当隔离出6个或更多位数字后,您可以根据需要替换它们,包括其他数字兄弟节点。无论如何最好保存原始数据,这样您就可以尝试训练检测算法,直到达到最佳效果。
然后,您还可以研究用户数据以创建更复杂的启发式方法,例如大小写不敏感的数字、混合、点分隔等等。
关键不在于编写最完美的正则表达式,而在于从统计和动态的角度来解决问题。
记住,在采取行动之后,用户会因此改变他们的插入习惯,所以统计数据会发生变化,您需要学习并更新您的启发式方法。
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的人们所说的那样。