Edited at

【PHP】文字列に日本語以外の文字が半分以上含まれているかを判別する方法

スパム的な文章を弾くために、日本語以外の文字が一定割合以上含まれているかどうかを判別したいことがあったので、その方法を書いていきます。(正確には全角文字と半角文字の判別をする形になります)


全角文字と半角文字の割合を算出する

全角文字と半角文字の割合を判別するために、mb_strlenmb_strwidthを使用します。


mb_strlen


mb_strlen — 文字列の長さを得る

文字列の長さを取得します。


引用元:PHP: mb_strlen - Manual

mb_strlenは、シングルバイト文字もマルチバイト文字も1としてカウントして長さを取得します。つまり文字数を取得するための関数となります。


mb_strwidth


mb_strwidth — 文字列の幅を返す

string str の幅を返します。 半角文字は 1 として、 全角文字は 2 として数えます。


引用元:PHP: mb_strwidth - Manual

mb_strwidthは、文字列のバイト数を取得するための関数となります。


mb_strlenとmb_strwidthを利用して割合算出

基本的には、バイト数から文字数を引くことで全角文字(マルチバイト文字)の数を算出することができます(絵文字などの4バイト文字などが含まれていない場合)。全角文字数を取得できたら、後はその値を文字数で割れば全角文字の割合を出すことができます。

$hoge = "Helloワールド";

$len = mb_strlen($hoge, "UTF-8");
$str_w = mb_strwidth($hoge,"UTF-8");

//全角文字の割合
$multibyte_rate = ($str_w - $len) / $len;
//半角文字の割合
$singlebyte_rate = 1 - $multibyte_rate;

if($singlebyte_rate >= 0.5){
echo '半分以上が半角文字です';
}


まとめ

mb_strlenとmb_strwidthを使用して文字数とバイト数を取得することで、絵文字などの4バイト文字が含まれていない限りは全角文字の割合を出すことができます。なので、日本語と英語(半角文字)の割合などは、基本この方法を使って算出できると思います。