为了打击某些垃圾邮件,我正在寻找一种方法来查明字符串是否包含任何中文/西里尔字符。
我在http://en.wikipedia.org/wiki/UTF-8检查了UTF-8中的字符范围,但我无法弄清楚如何使用PHP中的字符范围。
我真正想做的是计算西里尔范围或中国范围内的字符数。这可以用一些正则表达式完成吗?
答案 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;
}
虽然我老实说没有检查它。