preg_replace从字符串中删除电话号码

时间:2012-08-26 04:41:10

标签: php regex preg-replace preg-match

我有网站,我需要阻止用户通过邮件向其他用户发送联系电话/电子邮件,

我在某种程度上成功地使用了这个,但它确实做了我想做的事情,即匹配所有场景

public function clean_email($text){
    $pattern = '/\w+[\w-\.]*(\@\w+((-\w+)|(\w*))\.[a-z]{2,3})/i';
    preg_match($pattern, $text, $matches);
    return (isset($matches[1])) ? str_replace($matches[1], 
            "[********]", $text) : $text;
}

public function clean_phone($text){
    $pattern = '/(\d{3}|\d{4})|(\d{3,+})/i';
    preg_match($pattern, $text, $matches);
    return (isset($matches[1])) ? str_replace($matches[1], 
               "[********]", $text) : $text;
}

我正在考虑使用preg_replace来识别邮件文本中的电话号码,但我知道电话号码可以通过多种方式编写,如下所示,

0433 765 888
0433765888
+61433765888
+610433765888
+61 02 9876 0987
+61 0298760987
+610298760987

是否可以编写一个preg_replace模式来识别它们?

还需要对电子邮件地址执行相同的操作,我也想在电子邮件文本中找到的每个电子邮件地址中用[删除]替换它们。 I,E

mlanXXX@hotmail.com
mlanXXX AT hotmail.com

运气好..

1 个答案:

答案 0 :(得分:2)

我是Firefox广泛使用的单位转换扩展程序的作者,所以我对人们如何在非对抗环境中传达信息时用人类语言编写内容有很多经验。也就是说,当他们没有受到积极试图审查他们的对手的阻碍时。而且我告诉你,即使在这种情况下,正则表达式也不可能总是弄清楚他们想要表达的内容。

我需要长篇介绍才能提供这样的答案:不,它无法完成。你能做的就是参加军备竞赛。也就是说,实现任何简约的正则表达式现在都能正常工作,然后不断监视用户的通信,并根据它们提出的任何内容来改进你的正则表达式,以便绕过你。

但请注意,你永远找不到令人满意的解决方案,因为很快你就会陷入恼人的误报之中。以“我在amazon.com上发现这些鞋子”为例。您的代码将更改为“我发现这些[审查]”。电话号码更糟糕,因为人们可以将选定的数字写成单词(“043three376five ...”),所以你最终必须审查任何数字的所有提及。

这实际上是一个无法通过技术手段解决的社会问题。如果我是你,我会做的是实施少数明显的正则表达式(从而捕获99%的坦率用户),并用社会规则强制执行规则。也就是说,通过踢出试图绕过它的人来执行EULA。