PHP - 检测非英文字母和过滤输入

时间:2009-11-21 19:30:24

标签: php regex input-filtering

有一个评论表,我希望人们也可以用外语写作。 但是,例如,我的垃圾邮件过滤机制会阻止“été”这个词,因为它中没有元音(英语元音就是这样)。

我的问题是,当使用正则表达式检测元音时:

$pattern = '/[aeiou]/';

我不能简单地写

$pattern = '/[aeiouéáíúó...]/';

并且服务器会很好地解释它。 我该如何做才能解释好?

对于像俄语和希伯来语这样的非拉丁字母,是否有一种方法可以检测内容属于哪种语言并执行适当的垃圾邮件过滤机制?

整个垃圾邮件过滤的目的是阻止诸如“gjkdkgahg”或“ttt”之类的内容,它是一个公开可见的页面。

3 个答案:

答案 0 :(得分:1)

$pattern = '/[aeiouéáíúó]/';

使用u modifier来获取支持Unicode的正则表达式,这应该可行,假设您在整个应用程序中使用UTF-8字符串,您应该这样做。

  

对于像俄语和希伯来语这样的非拉丁字母,是否有一种方法可以检测内容属于哪种语言并执行适当的垃圾邮件过滤机制?

基本俄语在Unicode范围U + 0400-U + 04FF中找到;元音是аэыуояеёюи。希伯来语在U + 0590-U + 05FF范围内,并且不以同样的方式使用元音。我不认为检测元音是非常有用的......只要您坚持使用具有明确单词边界的语言,您可能会更喜欢使用涵盖多种语言的简单字典。对中文没用多少。

我认为这种事情根本就不是一个好的反垃圾邮件机制。这可能是假阳性,因为它是发现垃圾邮件,这毕竟往往是正确的单词。不同的扰流场(CSS隐藏的输入必须留空但不是机器人)和一次使用或限时提交令牌更有可能是有效的。

答案 1 :(得分:1)

您可以使用normalizer查找带有重音字符的字符串:

<?
    if (! normalizer_is_normalized($input)) {
        // handle non-normalized input
    }
?>

如果需要,您还可以使用此类来规范化字符串以搜索元音:

<?
    $norm = normalizer_normalize($input);
    if (! preg_match('/[aeiou]/', $norm)) {
        // handle no-vowels in input
    }
?>

您还需要阅读有关默认规范化表单的信息,并确保其符合您的要求。

答案 2 :(得分:0)

嗯,我个人认为像你这样的垃圾邮件过滤器效果太差。 IMO最好是查看链接,强词和性/ warez相关词,垃圾邮件通常包含它们。您可以仅对注册用户限制推荐权限,如果他们来自不受信任(=来自未注册用户)来源,您可以在他们出现之前将其删除为主持人。

相关问题