スパムと戦うために、文字列に中国語/キリル文字が含まれているかどうかを調べる方法を探しています。
http://en.wikipedia.org/wiki/UTF-8で UTF-8 の文字範囲を確認しましたが、PHP でそれらを操作する方法がわかりません。
私が本当にやりたいのは、キリル文字の範囲または中国語の範囲にある文字の数を数えることです。これはいくつかの正規表現で行うことができますか?
スパムと戦うために、文字列に中国語/キリル文字が含まれているかどうかを調べる方法を探しています。
http://en.wikipedia.org/wiki/UTF-8で UTF-8 の文字範囲を確認しましたが、PHP でそれらを操作する方法がわかりません。
私が本当にやりたいのは、キリル文字の範囲または中国語の範囲にある文字の数を数えることです。これはいくつかの正規表現で行うことができますか?
特定の Unicode 範囲に含まれているかどうか、各文字のバイト値を確認できます。Unicode 範囲のリストは次のとおりです: http://jrgraphix.net/research/unicode_blocks.php
PHP では、preg_match_allは完全なパターン一致の数を返します。
試す
$n = preg_match_all('/\p{Cyrillic}/u', $text);
また
$n = preg_match_all('/[\p{InCyrillic}\p{InCyrillic_Supplementary}]/u', $text);
正規表現での Unicode の使用に関する詳細については、この記事をお読みください。
これを使用すると、文字列が純粋なUTF-8であるかどうかを簡単に確認できます。
mb_check_encoding($inputString, "UTF-8");
気を付けてください。5.2.0から5.2.6までのバグがあるようです。
必要なものは、ドキュメントページmb_check_encoding、特にコメントで見つけることができます。あなたのケースにgmailドットコムの答えで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;
}
正直チェックしませんでしたが。