代码之家  ›  专栏  ›  技术社区  ›  Duck

在PHP表单上检测俄语字符

php
  •  11
  • Duck  · 技术社区  · 14 年前

    我有一个网站,人们可以在那里提交有关iPhone应用程序的链接。提交申请名称、说明、类别和网址。这个网站有很多年了,从来没有收到过任何来自俄罗斯开发者的建设性意见,但不幸的是,它被俄罗斯的垃圾邮件发送者发现,这让我非常恼火。即使采取了所有抵制垃圾邮件的措施,比如标题框等,一些人仍然坚持发送与iPhone无关的色情俄语内容。

    我想完全禁止使用俄语字符的任何URL或帖子。 对于URL,除了检查URL是否包含“.ru”,我没有太多事情要做。但为了便于描述,我想检测一下俄语字符。如何在PHP中实现这一点?

    谢谢。

    6 回复  |  直到 6 年前
        1
  •  49
  •   Alexander Konstantinov    14 年前

    _ 使用UTF-8正则表达式很容易(假设您的站点使用UTF-8编码):

    function isRussian($text) {
        return preg_match('/[А-Яа-яЁё]/u', $text);
    }
    
        2
  •  6
  •   Julia Clement    11 年前

    根据 PHP documentation ,从5.1.0版开始,就可以使用\p语言代码来查找以utf-8pcre正则表达式表示的特定(编写)脚本。对俄罗斯人来说

    preg_match( '/[\p{Cyrillic}]/u', $text); 
    

    页面上有一条警告:

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

        3
  •  2
  •   Luca Matteis    14 年前

    我会下载俄语字母表,然后用 strstr() . 例如:

    $russianChars = array('з', 'я'.. etc);
    
    foreach($russianChars as $char) {
        if(strstr($input, $char)) {
            // russian char found in input, do something
        }
    }
    

    一个好的算法可能会在找到3个左右的俄语字符后做一些事情,以确保该语言实际上是俄语(因为俄语字符可能出现在其他语言中,如果是这样的话,我建议做一些研究)。

        4
  •  1
  •   nathan    14 年前

    现在。。这个代码大约有5年的历史,当我遇到类似的问题时,“为我工作”

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

    因此,没有担保,没有任何种类的-但它可能会帮助你(基本上,它编码所有外国实体,然后检查常见的西里尔字符)

    最好!

        5
  •  0
  •   T.Todua Laurent W.    9 年前

    来源: 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"
    
        6
  •  0
  •   Louis Philippe    6 年前

    如果您有一个名为“描述”的描述输入,如下所示:

       <input name="description"/>
    

    在邮件程序文件中添加一个条件,如phpmailer或其他类似的条件:

    if (preg_match("/[А-Яа-яЁё]/u", $_POST['description'])) {
      echo "Sorry, no russian description allowed";
      die();
      }