MB_DECODE_NUMERICALENTITY関数の基本的な構文は次のとおりです。
mb_decode_numericentity(string $str, array $map, string $encoding): string|false
$ str :解析する文字列は通常、数値エンティティを含むHTMLまたはXMLエンコード文字列です。
$ MAP :数値エンティティのマッピング範囲を文字に定義する連想配列。
$エンコーディング:入力文字列の文字エンコード、通常はUTF-8 。
最も一般的な使用シナリオは、エスケープされたHTML文字( 「中」など)をWebページから対応する漢字(「中」など)に変換することです。例えば:
$input = "中文";
$output = mb_decode_numericentity($input, array(0x80, 0xFFFF), 'UTF-8');
echo $output; // 出力 “中国語”
この関数は、ニュートラルテキストを実際の文字「中央」と「テキスト」に変換します。
MB_DECODE_NUMERICALENTITYを使用する場合の最も簡単な問題の1つは、不一致をエンコードする文字です。この関数では、渡された文字列が$エンコードパラメーターと一致する必要があります。入力した文字列がEncodingとしてUTF-8をエンコードして通過するGBKである場合、解析結果が正しくない場合があります。
渡された文字列が$エンコードパラメーターのエンコードと一致していることを確認してください。あなたの文字列がGBKエンコードされている場合、それは次のように呼ばれるべきです:
$output = mb_decode_numericentity($input, array(0x80, 0xFFFF), 'GBK');
さらに、変換をエンコードする前に、文字エンコードを確認および統合することをお勧めします。
マップパラメーターは、デジタルエンティティマップの範囲を定義します。すべての有効なHTML数値エンティティを対応する文字に変換する場合は、マップパラメーターを慎重に設定する必要があります。範囲セットが小さすぎる場合、一部の文字は正しく解析されない場合があります。
たとえば、配列(0x80、0xffff)のみを指定する場合、これらの範囲の文字のみが解析されます。より広い文字セットを解析する場合は、この範囲を調整する必要がある場合があります。
一般的に言えば、配列(0、0xffff)を使用すると、すべての有効な文字エンティティ範囲がオーバーライドされます。例えば:
$output = mb_decode_numericentity($input, array(0, 0xFFFF), 'UTF-8');
このプラクティスにより、最も一般的な文字セットを正しく解析できるようになります。
一部のWebページには、HTMLエンティティ( &など)とデジタルエンティティ(こちらなど)の両方が含まれている場合があります。これら2つのエスケープメソッドが同時に使用される場合、 MB_DECODE_NUMERICALENTITYを直接呼び出すことはデジタルエンティティのみを処理できますが、HTMLエンティティを自動的に処理することはできません。この場合、 HTML_ENTITY_DECODE関数を使用してHTMLエンティティを対応する文字に変換し、 MB_DECODE_NUMERICALENTITYでデジタルエンティティを処理する必要がある場合があります。
最初にHTML_ENTITY_DECODEを使用してHTMLエンティティを処理し、次にMB_DECODE_NUMERICALENTITYを使用してデジタルエンティティを解析します。
$input = html_entity_decode($input, ENT_QUOTES, 'UTF-8');
$output = mb_decode_numericentity($input, array(0, 0xFFFF), 'UTF-8');
これにより、両方のエンティティが正しく解析されることが保証されます。
MB_DECODE_NUMERICALENTITY関数は、特に長い文字列または多数の数値エンティティを扱う場合、プロセスが比較的遅くなります。アプリケーションでこの種の分析が頻繁に必要な場合は、パフォーマンスボトルネックに遭遇する可能性があります。
この場合、分析の最適化を考慮することができます。たとえば、フロントエンドのエンティティを事前に処理するか、キャッシュを使用して同じ文字列を複数回解析しないようにします。
MB_DECODE_NUMERICALENTITY関数は、無効なデジタルエンティティを処理するときにFALSEを返します。入力に未解決の数値エンティティが含まれている場合、機能の返品値をさらに処理する必要があります。
mb_decode_numericalentityを呼び出して、解析障害によって引き起こされるエラーを回避するために、返品値がfalseかどうかを必ず判断してください。
$output = mb_decode_numericentity($input, array(0, 0xFFFF), 'UTF-8');
if ($output === false) {
echo "分析に失敗しました!";
} else {
echo $output;
}