このサイトには広告が含まれています

PHP|mb_convert_encodingはphp8.2以降で非推奨。対応策はこちら

HTML文字列を処理するためにmb_convert_encoding($contents, 'HTML-ENTITIES', 'UTF-8')と書いたらDeprecatedエラー。解決方法メモ。

結論:PHP 8.2以降の対応コード

$contents = "テスト & テキスト";
$converted = mb_encode_numericentity($contents, [0x80, 0xffff, 0, 0xffff], 'UTF-8');
echo $converted;// 出力: テスト & テキスト

解説

mb_encode_numericentity()の構文

mb_encode_numericentity(string $string, array $convmap, string $encoding): string
  • 第一引数: 変換対象の文字列。
  • 第二引数: 数値エンティティ化するUnicode範囲を指定する配列(convmap
  • 第三引数: 入力文字列のエンコーディング(例: 'UTF-8'

convmapの設定

convmapは、変換する文字範囲を指定。

$convmap = [start_code, end_code, offset, mask];
  • start_code: 変換対象の開始Unicodeコードポイント。
  • end_code: 変換対象の終了Unicodeコードポイント。
  • offset: 数値エンティティの基準(通常は0
  • mask: マスク値(通常は0xffff

例:

$convmap = [0x80, 0xffff, 0, 0xffff]; // Unicode範囲: U+0080~U+FFFF

上記コードでは、文字列中のUnicodeコードポイントが0x80から0xffffに該当する場合、それらが数値エンティティ(例: &)に変換される。

DOMDocumentと組み合わせる場合

HTML文字列を処理するためにDOMDocument::loadHTML()を使用している場合にも利用可。

非推奨コード:

$dom = new DOMDocument();
$dom->loadHTML(mb_convert_encoding($contents, 'HTML-ENTITIES', 'UTF-8'));

推奨コード:

$dom = new DOMDocument();
$encodedContents = mb_encode_numericentity($contents, [0x80, 0xffff, 0, 0xffff], 'UTF-8');
$dom->loadHTML($encodedContents);

アクセシビリティと互換性

  1. ブラウザ互換性:
    • 数値エンティティ(例: &)はすべてのブラウザでサポート。
  2. パフォーマンス:
    • mb_encode_numericentity()は軽量で高速。
    • 非推奨機能を回避することで将来の互換性も確保できる。
  3. 安全性:
    • 必要な範囲だけ数値エンティティ化できるため不要な変換を防げる。

まとめ

PHP 8.2以降では、以下のように置き換えることで非推奨メッセージを回避しつつ、同等の機能を実現できる。

  1. 使用していたmb_convert_encoding()mb_encode_numericentity()に変更。
  2. 適切な変換マップ(convmap)を設定。
  3. 必要に応じてエンコーディングや文字範囲を調整。

コードの利用は自己責任でお願いいたします。

本記事の一部はAIによって生成されました。AIが生成した部分については、著者が内容を確認し必要に応じて修正を加えています。

コメント欄

タイトルとURLをコピーしました