PHP の漢字置換とパターン マッチングの問題_PHP チュートリアルをお読みください。
著者: bluedoor
元の投稿アドレス: http://www.anbbs.com/anbbs/index.php?f_id=3&page=1
過去 2 日間、キーワード強調プログラムに取り組んできました。書かれたプログラムはローカルです。テストもうまくいきましたが、ページに行くと文字化けの山があり、ハイライトどころか文字が読めません!
エラーを探して調べてみたところ、英語は問題ありませんでしたが、中国語の文字に遭遇すると問題が発生しやすく、中国語の文字に遭遇すると必ず問題が発生する場合がありました。
まとめると:
preg_match_all($pat,...) や preg_replace($pat,...)... などのパターンマッチングを使用する場合
問題が発生しやすい状況は次のとおりです:
preg_match_all( "/(漢字)+ /ism","私は漢字です。あなたが私に何をするか見てみましょう! ",$m_a); このパターンは、「漢字」と一致するのが非常に簡単です。この場合、漢字を含むパターンは正常に一致しますが、結果が不確かなので、あまり早く満足しないでください。
問題が発生する状況は以下の通りです:
preg_match_all("/[漢字]+/ism","私は漢字です、あなたが私に何をするか見てみましょう!",$m_a); 「汉」、「字」、または「漢字」の出現に一致します。これにより、マッチング結果が文字化けし、無限ループが発生する可能性があります。なぜこのようなことが起こるのでしょうか?これは、PHP が内部で UNICODE を使用しておらず、マルチバイト テキストをサポートしていないため、パターン マッチングでは「漢字」が 4 バイトの ASCII として扱われるためです。エラーが発生しないのはおかしいでしょう。
その後、パターンマッチングを書き直そうとしたところ、問題を解決できそうな(なぜらしいと言うのか?後で見てください)メソッドを見つけました:
preg_match_all("/(汉|字)+/ism"," I am a Chinese Character, see What are you doing to me! ",$m_a);
このように書くと、"汉"、"字"、または "汉字" に一致し、結果は $m_a
配列
(
[0 ] => 配列
(
[0 ] => 漢字
(
[0] => 漢字
)
)
完全に一致した文字列はどうでしょうか登場!しかし、喜ぶのはまだ早く、実際に使用すると問題が発生することがよくあります。もう一度問題を探したところ、ついに問題の根本が見つかりました。 PHP はマルチバイトテキストをサポートしていないため、パターンマッチングと文字操作は内部コード変換後に実行されます (これが正しいかどうかはわかりません)。例を挙げてみましょう:
eregi_replace("性","No " , " Responsible"); この操作は、文字列 "Responsible" 内の "gender" という単語を "no" に置き換えることです。最終的な結果はどうなりますか? 「責任感」に「性別」はないので、置換操作を実行せずに「責任感」を返すはずが、結果は「責任感」だった!
予想外でした!なぜ? ASCII コードを見てみるとわかります。ASCII コードは 211,208 (責任)、200,206 (任意)、184,208 (意味) という漢字の「責任感」をコード化しています。そして「性別」 エンコードは 208,212 (性別) で、これはたまたまコードの 2 バイト目と 1 バイト目の組み合わせと一致しています。つまり、PHP は、一致する同じパターンを見つけて、中国語の文字を半分に分割し、置換された文字列と結合することを知っていたため、何か問題が発生しました。
当時は、最も一般的に使用される str_replace() は問題ないと思っていましたが、実際には、同じ操作を実行すると str_replace() もエラーを起こします。以前に漢字置換を行っていて本当に良かったと今では思います。おそらく、このとき行われた漢字置換は比較的長い漢字列であったため、上記のような事態は起こりにくいと考えられます。たとえ何も問題がなかったとしても、安全ではないことを知ってください。
問題はある、そして私たちは働き続けなければならない、乗り越えなければならない唯一の困難は今の私たちです。
幸いなことに、私は PHP 拡張モジュールのセットである Multibyte String Functions を思い出しました。これは、次のようなマルチバイト テキスト操作をサポートする多くの関数を追加します。 ereg_replace() は mb_ereg_replace() に対応します。特定の機能の説明については、関連記事を参照してください。
要約: 漢字を安全に操作するには、マルチバイト文字列関数を使用するのが最善です。
http://www.bkjia.com/PHPjc/532003.html

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、
