我知道可以用坏词(检查一组预设词)来完成,但如何检测长文本中的电话号码? 我正在为一个客户建立一个PHP网站,该客户需要避免使用描述字段来设置他们的手机号码。(参见craigslist等)。
除了他需要一些节制,但我想知道是否有办法阻止至少明显像nnn-nnn-nnnn
,而不是要求阻止其他奇怪的写作方式,如HeiGHT*/four*/nine
等。
答案 0 :(得分: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+以上的连续数,这可能是不可取的!
答案 1 :(得分: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,您甚至可以在线进行测试。这是测试正则表达式的一个很好的工具。
答案 2 :(得分:0)
preg_match($ pattern,$ subject)将返回1(true),否则返回0(false)。
与您提供的示例匹配的模式可能是'/ \ d {3} - \ d {3} \ d {4} /'
但是,无论您为模式选择什么,都会遭受误报和误报。
你也可以考虑在号码旁边寻找像mob,cell或tel这样的词。
可以在http://www.php.net/manual/en/reference.pcre.pattern.syntax.php
找到php模式匹配的填充详细信息伊恩
P.S。对于不好的话,这是不可能的,因为斯肯索普的人会告诉你。
答案 3 :(得分:0)
我认为使用过于严格的常规表达会导致大量检测失败。
您应该检查包含超过5位数的10个连续聊天的部分。
所以类似的是,由于计算权重的原因,您将在任何消息插入后排队等待调用的analisys例程。
在隔离了6位或更多位数后,根据您的喜好替换它们,包括其他的syblings数字。 在任何情况下都更好地保留原始数据,因此您可以尝试并训练您的检测算法,直到它以最佳方式工作。
然后你也可以研究你的用户数据来创建更复杂的数据,例如写成字母,混合,点分隔等的不区分大小写的数字......
这不是关于写出最完美的正则表达式,而是关于从统计上和动态上接近问题。
请记住,在您采取行动后,用户将改变他们的插入习惯,因此统计数据会发生变化,您需要学习和更新您的商品。