检测字符串中的非英语字符

时间:2012-10-29 11:11:20

标签: php regex utf-8

为了打击某些垃圾邮件,我正在寻找一种方法来查明字符串是否包含任何中文/西里尔字符。

我在http://en.wikipedia.org/wiki/UTF-8检查了UTF-8中的字符范围,但我无法弄清楚如何使用PHP中的字符范围。

我真正想做的是计算西里尔范围或中国范围内的字符数。这可以用一些正则表达式完成吗?

4 个答案:

答案 0 :(得分:2)

您可以检查每个字符的字节值以包含在特定的Unicode范围内。以下是Unicode范围列表:http://jrgraphix.net/research/unicode_blocks.php

答案 1 :(得分:1)

在PHP中,preg_match_all返回完整模式匹配的数量。

尝试

$n = preg_match_all('/\p{Cyrillic}/u', $text);

$n = preg_match_all('/[\p{InCyrillic}\p{InCyrillic_Supplementary}]/u', $text);

有关在正则表达式中使用unicode的更多信息,请阅读this article

答案 2 :(得分:1)

在这里找到了一个不错的解决方案:https://devdojo.com/blog/tutorials/php-detect-if-non-english

使用此代码:

function is_english($str)
{
    if (strlen($str) != strlen(utf8_decode($str))) {
        return false;
    } else {
        return true;
    }
}

它的工作原理是因为utf8_decode用单个字节替换多字节字符,这会导致不同的字符串长度。

答案 3 :(得分:0)

您可以使用以下方法轻松检查字符串是否为纯UTF-8:

mb_check_encoding($inputString, "UTF-8");

请注意,它似乎有从5.2.0到5.2.6的错误

您也可以在文档页面上找到您想要的内容mb_check_encoding,特别是在评论中。在gmail dot com的答案中调整javalc6:

function check_utf8($str) {
    $count = 0; // Amount of characters that are not UTF-8
    $len = strlen($str); 
    for($i = 0; $i < $len; $i++){ 
        $c = ord($str[$i]); 
        if ($c > 128) { 
            $bytes = 0;
            if ($c > 247) {
                ++$count;
                continue;
            } else if ($c > 239)
                $bytes = 4; 
            else if ($c > 223)
                $bytes = 3; 
            else if ($c > 191)
                $bytes = 2; 
            else {
                ++$count;
                continue;
            }
            if (($i + $bytes) > $len) {
                ++$count;
                continue;
            }
            while ($bytes > 1) { 
                $i++; 
                $b = ord($str[$i]); 
                if ($b < 128 || $b > 191)
                    ++$count;
                $bytes--; 
            }
        }
    }
    return count;
}

虽然我老实说没有检查它。