MB_ENCODE_NUMERICALENTITY関数の基本的な構文は次のとおりです。
<span><span><span class="hljs-title function_ invoke__">mb_encode_numericentity</span></span><span>(</span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$str</span></span><span>, </span><span><span class="hljs-keyword">array</span></span><span> </span><span><span class="hljs-variable">$convmap</span></span><span>, </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$from_encoding</span></span><span>, </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$to_encoding</span></span><span>): </span><span><span class="hljs-keyword">string</span></span><span>
</span></span>
$ str :変換する文字列。
$ CONVMAP :文字変換マッピングルールは、数値エンティティに変換する必要がある文字を指定する配列です。
$ from_encoding :元の文字セット(UTF-8、ISO-8859-1など)。
$ TO_ENCODING :ターゲット文字セット(UTF-8、ISO-8859-1など)。
この関数は、文字列内の文字をHTMLまたはXML形式のデジタルエンティティに変換します。 $ Convmapパラメーターで指定されたルールに従って。 $ Convmapアレイの構成は、変換効果に重要です。
$ CONVMAPパラメーターは配列で、4つの要素のサブアレイのセットで構成され、それぞれが文字変換の範囲またはルールを定義します。その構造は次のとおりです。
<span><span><span class="hljs-variable">$convmap</span></span><span> = [
[文字コードから, 文字コードへ, キャラクターセットから, キャラクターセットに],
</span><span><span class="hljs-comment">// その他のルール</span></span><span>
];
</span></span>
文字コードから:これは、数値エンティティの変換のための開始文字コードです。通常、元の文字セットの文字の位置を表す整数です。
文字コードへ:これは、デジタルエンティティ変換の最終文字コードであり、変換の範囲を指定します。
文字セットから:入力文字列のエンコードタイプの文字を指定します。
キャラクターセットへ:変換された文字のエンコーディングタイプ(通常はUTF-8)を指定します。
たとえば、 $ convmapを構成する場合、文字範囲を定義して、デジタルエンティティに変換される文字を制御できます。
$ convmapパラメーターを正しく構成すると、変換ルールを正確に制御できます。構成のヒントは次のとおりです。
特定の特定の文字をデジタルエンティティに変換したい場合は、文字コード範囲を設定してこれを行うことができます。 ASCII文字以外のすべての文字を数値エンティティに変換したいと仮定すると、ASCII範囲外の文字コードを含む$コンブマップを構成できます。
<span><span><span class="hljs-variable">$convmap</span></span><span> = [
[</span><span><span class="hljs-number">0x80</span></span><span>, </span><span><span class="hljs-number">0x10FFFF</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>]
];
</span></span>
この構成は、UTF-8エンコーディング範囲の0x80以上(つまり、ASCII以外の文字)以上のすべての文字がデジタルエンティティに変換されることを意味します。
HTMLコンテンツを専門とし、特定の特別なシンボル( < 、 >など)をHTMLデジタルエンティティに変換したい場合は、対応する文字範囲を設定してこれを行うことができます。
<span><span><span class="hljs-variable">$convmap</span></span><span> = [
[</span><span><span class="hljs-number">0x20</span></span><span>, </span><span><span class="hljs-number">0x2F</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>], </span><span><span class="hljs-comment">// 変換するASCII句読点</span></span><span>
[</span><span><span class="hljs-number">0x3A</span></span><span>, </span><span><span class="hljs-number">0x40</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>], </span><span><span class="hljs-comment">// 変換する冒号到@キャラクター</span></span><span>
];
</span></span>
この構成の後、条件を満たすすべての文字が対応するデジタルエンティティに変換されます。
Unicode文字の場合、すべての言語と特別なシンボルが適切に変換されるように、より広い範囲を定義できます。この方法は、多言語文字を含むシナリオに特に役立ちます。
<span><span><span class="hljs-variable">$convmap</span></span><span> = [
[</span><span><span class="hljs-number">0x3000</span></span><span>, </span><span><span class="hljs-number">0x303F</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>], </span><span><span class="hljs-comment">// 変換するCJKシンボルそして句読点</span></span><span>
];
</span></span>
この構成は、中国語、日本、韓国語、その他の言語の特別なシンボルに適した0x3000から0x303Fの間のすべてのユニコード文字をデジタルエンティティに変換します。
MB_ENCODE_NUMERICALENTITYは強力ですが、使用する場合は次の点に注意する必要があります。
着信文字エンコード( $ from_encodingと$ to_encoding )が正しいことを確認してください。たとえば、ソース文字列がUTF-8エンコーディングであり、ターゲットエンコードがISO-8859-1の場合、2つのコードまたは変換エラーを回避するために、対応するエンコードを明示的に指定する必要があります。
$ convmapを定義するときは、文字範囲のオーバーライドを確認してください。範囲が狭すぎると設定されている場合、一部の文字は変換されない場合があります。範囲が大きすぎると、他の文字の変換に不必要に影響する可能性があります。したがって、実際のニーズに応じてキャラクターの範囲を改良することが最善です。
複数の文字セットの非常に大きな文字列または変換の場合、 MB_ENCODE_NUMERICALENTITYはパフォーマンスに影響を与える可能性があります。変換プロセスを小さなユニットに分割するか、特定の文字セットのみを不必要な処理を避けるために変換することを検討してください。
さまざまなPHPバージョンまたは環境は、 MB_ENCODE_NUMERICALENTITYを異なる方法でサポートする場合があります。それを使用するときは、Mbstring拡張機能がPHP環境に正しくインストールされていること、および拡張機能のバージョンが必要な機能をサポートしていることを確認してください。
MB_ENCODE_NUMERICALENTITYを使用して特殊文字を含むテキストを処理する方法を示す実用的なアプリケーションケースを次に示します。
<span><span><span class="hljs-variable">$str</span></span><span> = </span><span><span class="hljs-string">"这是一个测试キャラクター串,含む <、> そして & シンボル。"</span></span><span>;
</span><span><span class="hljs-variable">$convmap</span></span><span> = [
[</span><span><span class="hljs-number">0x80</span></span><span>, </span><span><span class="hljs-number">0x10FFFF</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>] </span><span><span class="hljs-comment">// すべて非ASCIIキャラクター変換する为数字实体</span></span><span>
];
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mb_encode_numericentity</span></span><span>(</span><span><span class="hljs-variable">$str</span></span><span>, </span><span><span class="hljs-variable">$convmap</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$result</span></span><span>;
</span></span>
出力は、すべての非ASCII文字が次のようなデジタルエンティティに変換されることです。
<span><span>这是一个测试キャラクター串,含む </span><span><span class="hljs-selector-tag">&</span></span><span><span class="hljs-selector-id">#60</span></span><span>;、</span><span><span class="hljs-selector-tag">&</span></span><span><span class="hljs-selector-id">#62</span></span><span>; そして </span><span><span class="hljs-selector-tag">&</span></span><span><span class="hljs-selector-id">#38</span></span><span>; シンボル。
</span></span>
この取り扱い方法は、XSS攻撃、HTMLレンダリングエラー、その他の問題を回避するのに非常に役立ちます。