在PHP中检测表单中的俄语字符

26

我有一个网站,人们可以提交关于 iPhone 应用程序的链接。用户会提交应用程序名称、描述、分类和 URL。这个网站已经运行多年了,但从未收到过来自俄罗斯开发者的有建设性的提交。不幸的是,俄罗斯垃圾邮件发送者却发现了它,让我非常恼火。即使采取了所有防止垃圾邮件的措施,比如验证码等,一些人还是坚持发送与 iPhone 毫无关系的俄语色情内容。

我想完全禁止任何使用俄语字符发布的 URL 或帖子。对于 URL,我能做的不多,除了检查 URL 中是否包含“.ru”。但是对于描述,我想检测其中的俄语字符。请问在 PHP 中怎么做?

谢谢。


7个回答

77

实际上非常简单如果你的网站使用UTF-8编码,可以使用UTF-8正则表达式轻松完成:

function isRussian($text) {
    return preg_match('/[А-Яа-яЁё]/u', $text);
}

我测试了所有三种方法。你的方法在我的情况下是有效的。而且从你的名字来看,你可能来自那里!:-) 谢谢。 - Duck
2
@Mike,差不多,我说俄语但不是来自俄罗斯 :) - Alexander Konstantinov
很酷...我喜欢那些俄语字符...它是一种看起来像镜子里写的语言... :-) - Duck
2
谢谢。我也发现使用 preg_match_all 并计算俄语字符数量,再用它来获得百分比很有用。有点类似贝叶斯方法。 - parkerfath
不错,但不是理想的解决方案。这意味着您必须将您的php文件保存为UTF8。 - Cymro
显示剩余2条评论

15
根据PHP文档,自5.1.0版本以来,可以使用\p{语言代码}在utf-8 PCRE正则表达式中查找特定(书写)脚本。对于俄语而言,代码为。
preg_match( '/[\p{Cyrillic}]/u', $text); 

页面上有一个警告:

通过Unicode属性匹配字符不够快,因为PCRE必须搜索包含超过15000个字符数据的结构。


谢谢。对 PCRE/REGEX/UNICODE 文档的参考非常有趣。这个答案对我来说是最有用的。 - Frédéric Hebrard

3

现在这段代码已经有5年的历史了,当我遇到类似问题时,这段代码曾经对我有用。

function detect_cyr_utf8($content)
{
  return preg_match('/&#10[78]\d/', mb_encode_numericentity($content, array(0x0, 0x2FFFF, 0, 0xFFFF), 'UTF-8'));
}

因此没有任何保证,也没有其他任何形式的保证 - 但它可能会帮助您(基本上编码所有外来实体,然后检查常见的西里尔字符)。
最好!

2
我会下载俄语字母表并使用 strstr() 检查输入字符串。例如:
$russianChars = array('з', 'я'.. etc);

foreach($russianChars as $char) {
    if(strstr($input, $char)) {
        // russian char found in input, do something
    }
}

一个好的算法可能会在发现3个俄语字符后采取一些措施,以确保语言确实是俄语(因为俄语字符可能出现在其他语言中,如果是这种情况,建议进行一些研究)。

1
如果您有一个名为“description”的输入框来描述您的内容,代码如下:
   <input name="description"/>

在您的邮件发送文件中,例如phpmailer或其他类似的文件,添加一个条件:
if (preg_match("/[А-Яа-яЁё]/u", $_POST['description'])) {
  echo "Sorry, no russian description allowed";
  die();
  }

虽然这段代码可能回答了问题,但提供有关它如何以及/或为什么解决问题的附加上下文将改善答案的长期价值。 - Nic3500

1

来源:http://zurb.com/forrst/posts/Convert_cyrillic_to_latin_in_PHP-vWz

function ru2lat($str)    {
    $tr = array(
    "А"=>"a", "Б"=>"b", "В"=>"v", "Г"=>"g", "Д"=>"d",
    "Е"=>"e", "Ё"=>"yo", "Ж"=>"zh", "З"=>"z", "И"=>"i", 
    "Й"=>"j", "К"=>"k", "Л"=>"l", "М"=>"m", "Н"=>"n", 
    "О"=>"o", "П"=>"p", "Р"=>"r", "С"=>"s", "Т"=>"t", 
    "У"=>"u", "Ф"=>"f", "Х"=>"kh", "Ц"=>"ts", "Ч"=>"ch", 
    "Ш"=>"sh", "Щ"=>"sch", "Ъ"=>"", "Ы"=>"y", "Ь"=>"", 
    "Э"=>"e", "Ю"=>"yu", "Я"=>"ya", "а"=>"a", "б"=>"b", 
    "в"=>"v", "г"=>"g", "д"=>"d", "е"=>"e", "ё"=>"yo", 
    "ж"=>"zh", "з"=>"z", "и"=>"i", "й"=>"j", "к"=>"k", 
    "л"=>"l", "м"=>"m", "н"=>"n", "о"=>"o", "п"=>"p", 
    "р"=>"r", "с"=>"s", "т"=>"t", "у"=>"u", "ф"=>"f", 
    "х"=>"kh", "ц"=>"ts", "ч"=>"ch", "ш"=>"sh", "щ"=>"sch", 
    "ъ"=>"", "ы"=>"y", "ь"=>"", "э"=>"e", "ю"=>"yu", 
    "я"=>"ya", " "=>"-", "."=>"", ","=>"", "/"=>"-",  
    ":"=>"", ";"=>"","—"=>"", "–"=>"-"
    );
    return strtr($str,$tr);
}

然后。
echo ru2lat( "текст по-русски");  -------------->   "tekst po-russki"

0

我知道这个问题可能与 PHP 无关,但我也遇到了类似的联系表单垃圾邮件问题。如果您的网站在Cloudflare后面,则可以通过检查请求来源国家来限制垃圾邮件。然后您可以将其标记为潜在垃圾邮件,并稍后验证是否可以发布。

最终,我开始将所有来自不同国家的邮件都标记为垃圾邮件,快速浏览是否有任何有价值的内容,然后删除其余部分。我还会将信息返回给潜在的垃圾邮件发送者,告诉他们解决 reCAPTCHA 不正确,即使已经正确解决。随着时间的推移,垃圾邮件数量显著下降。

Cloudflare 在标题中返回国家代码,此值可在 $_SERVER['HTTP_CF_IPCOUNTRY'] 变量中使用。


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