PHP正則判断中国語UTF-8またはGBKの考え方と具体的な実現

2394 ワード

UTF-8マッチング:javascriptでは文字列が中国語であると判断するのは簡単です.例:
 
  
var str = "php ";
if (/^[\u4e00-\u9fa5]+$/.test(str)) {
alert(" ");
}else{
alert(" ");
}
//php , \x 。 , :
$str = "php ";
if (preg_match("/^[\x4e00-\x9fa5]+$/",$str)) {
print(" ");
} else {
print(" ");
}

间违いなく报告されたようで、判断の结果も正确だったが、$strを「プログラミング」に変えたところ、「この文字列はすべて中国语ではない」という判断が出た.重要:調べたところ、[x 4 e 00-x 9 fa 5]というものに対して、自分で強化した解釈phpの正則の中で、[x 4 e 00-x 9 fa 5]は、実は文字と文字グループの概念であり、x{hex}は、16進数を表し、hexは1-2位でも4位でもよいことに注意しなければならないが、4位であれば括弧をつけなければならないと同時に、x{FF}より大きいhexであれば、u修飾子と連用しなければなりません.そうしないと不法にエラーが発生します.
ネット上では全角文字に一致する正則しか見つかりません:^[x 80-xff]*^/、ここではカッコを大きくしないことができます
[u 4 e 00-u 9 fa 5]は中国語にマッチしますが、PHPはサポートしていません
しかし、xが示す16進数データである以上、jsで提供される範囲x 4 e 00-x 9 fa 5とはなぜ異なるのでしょうか.そこで私は下のコードに変えて、本当に正確であることを発見しました.
 
  
$str = "php ";
if (preg_match("/^[\x{4e00}-\x{9fa5}]+$/u",$str)) {
print(" ");
} else {
print(" ");
}

phpにおけるutf-8符号化の下で正則表現で漢字をマッチングする最終的な正しい表現が分かった――/^[x{4 e 00}-x{9 fa 5}+$/u,
以上の記事を参考に以下のテストコードを書きました(以下のコードをコピーして.phpファイルに保存します)
 
  
$action = trim($_GET['action']);
if($action == "sub")
{
$str = $_POST['dir'];
//if(!preg_match("/^[".chr(0xa1)."-".chr(0xff)."A-Za-z0-9_]+$/",$str)) //GB2312
if(!preg_match("/^[\x{4e00}-\x{9fa5}A-Za-z0-9_]+$/u",$str)) //UTF-8
{
echo " [".$str."] ";
}
else
{
echo " [".$str."] , !";
}
}
?>
 
  

( , , , ):




GBK: preg_match("/^[".chr(0xa1)."-".chr(0xff)."A-Za-z0-9_]+$/",$str);//GB 2312漢字英数字下線正規表現.