ホームページ >バックエンド開発 >PHPチュートリアル >中国語に一致する PHP 正規表現に関するいくつかの問題の解決策

中国語に一致する PHP 正規表現に関するいくつかの問題の解決策

WBOY
WBOYオリジナル
2016-07-25 08:59:132021ブラウズ


  1. $str = '中華人民共和国 123456789abcdefg';
  2. echo preg_match("/^[u4e00-u9fa5_a-zA-Z0-9]{3,15}$",$strName) ;
  3. ?>
コードをコピーします

上記のコードを実行すると、次のメッセージが表示されます。 警告: preg_match(): コンパイルに失敗しました: PCRE は、F:wwwrootphptest.php の 2 行目のオフセット 3 で L、l、N、P、p、U、u、または X をサポートしていません

その理由は、次の Perl エスケープ シーケンスが PHP 正規表現でサポートされていないためです: L、l、N、P、p、U、u、または X

UTF-8 モードでは、「x{...}」が許可され、中括弧内の内容は 16 進数を表す文字列です。

元の 16 進エスケープ シーケンス xhh は、値が 127 より大きい場合、2 バイトの UTF-8 文字と一致します。 解決:

  1. preg_match("/^[x80-xff_a-zA-Z0-9]{3,15}$",$strName);
  2. preg_match('/[x{2460}-x{2468}] /u', $str);
コードをコピー

内部コードの漢字と一致 彼が提供したようにテストしてください:

  1. $str = "phpプログラミング";
  2. if (preg_match("/^[x{2460}-x{2468}]+$/u",$str)) {
  3. print("文字列はすべて中国語です");
  4. } else {
  5. print("文字列はすべて中国語ではありません");
  6. }
  7. ?>
コードをコピーします

この操作はまだ正しいです。中国人かどうかは異常だ。しかし、xで表現される16進数のデータなのに、jsで用意されているx4e00~x9fa5の範囲と違うのはなぜでしょうか? したがって、コードは次のように変更されました。

  1. $str = "phpプログラミング";
  2. if (preg_match("/^[x4e00-x9fa5]+$/u",$str)) {
  3. print("この文字列 すべてare Chinese");
  4. } else {
  5. print("This string is not all Chinese");
  6. }
  7. ?>
コードをコピー

警告が再度生成されます。 警告: preg_match() [function.preg-match]: コンパイルに失敗しました: test.php の 3 行目のオフセット 6 に無効な UTF-8 文字列があります 次に、これを変更して、「4e00」と「9fa5」をそれぞれ「{」と「}」で囲み、再度実行したところ、今度は正確であることがわかりました。

  1. $str = "phpプログラミング";
  2. if (preg_match("/^[x{4e00}-x{9fa5}]+$/u",$str)) {
  3. print("この文字列はすべて中国語です");
  4. } else {
  5. print("この文字列はすべて中国語ではありません");
  6. }
  7. ?>
コードをコピー

php の utf は知っています。 -8 エンコーディングで正規表現を使用して中国語の文字を照合するための正しい表現: /^[x{4e00}-x{9fa5}]+$/u,

実装コードの最終バージョン:

  1. //if (preg_match("/^[".chr(0xa1)."-".chr(0xff)."]+$/", $str)) { / /GB2312の場合のみ使用可能
  2. if (preg_match("/^[x7f-xff]+$/", $str)) { //gb2312、utf-8と互換性あり
  3. echo "正しい入力";
  4. } else {
  5. echo "入力が間違っています";
  6. }
  7. ?>
コードをコピー

例 2、

  1. $action = trim($_GET['action']);
  2. if($action == "sub")
  3. {
  4. $str = $_POST['dir'];
  5. //if(!preg_match("/^[".chr(0xa1)."-".chr(0xff)."A-Za-z0-9_]+$/",$str)) //GB2312 中国語文字 英数字の下線 正規表現
  6. if(!preg_match("/^[x{4e00}-x{9fa5}A-Za-z0-9_]+$/u",$str)) //UTF-8 漢字文字数値の下線の正規表現
  7. {
  8. echo "入力した [".$str."] には不正な文字が含まれています"
  9. }
  10. else
  11. {
  12. echo "入力した [".$str."] は完全に正当であり、合格しました!";
  13. }
  14. }
  15. ?>
  16. 入力文字(数字、文字、漢字、アンダースコア):
PHPの全角文字エンコード範囲のコードをコピー

1. GBK (GB2312/GB18030)

x00-xff GBK 2 バイトエンコード範囲 x20-x7f アスキー xa1-xff 中国語 gb2312 x80-xff 中国語 GBK

2. UTF-8 (ユニコード)

u4e00-u9fa5 (中国語) x3130-x318F (韓国語) xAC00-xD7A3 (韓国語) u0800-u4e00 (日本語)

これらを紹介しましょう。PHP で中国語を正規にマッチングする方法を皆さんが理解するのに役立つことを願っています。 Programmer's Home の皆様の学習と進歩がますますご発展されることをお祈りしております。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。