【PHP8.x】htmlentities関数の使い方

作成日: 更新日:

htmlentities関数は、文字列中の文字を対応するHTMLエンティティに変換する関数です。この関数は、特にWebアプリケーションにおいて、ユーザーからの入力を安全に表示するために重要です。例えば、<> などのHTMLタグとして解釈される可能性のある文字を、それぞれ &lt;&gt; といったエンティティに変換することで、クロスサイトスクリプティング(XSS)攻撃を防ぐことができます。

この関数は、変換対象となる文字列の他に、変換に使用する文字コードセットを指定することができます。文字コードセットを指定しない場合は、PHPの設定ファイルで指定されたデフォルトの文字コードセットが使用されます。また、double_encode オプションを使用することで、既にエンティティ化されている文字を再度エンティティ化するかどうかを指定できます。デフォルトでは、二重エンコードは行われます。

htmlentities関数は、htmlspecialchars関数と似ていますが、htmlspecialchars関数よりも多くの文字をエンティティに変換します。具体的には、htmlentities関数は、ISO-8859-1文字セット全体、または指定された文字セットに基づいて、より広範囲の文字を変換します。htmlspecialchars関数は、HTMLの基本的な制御文字(<>"'&)のみを対象とします。そのため、より広範な文字を安全にエスケープする必要がある場合は、htmlentities関数を使用することが推奨されます。ただし、htmlentities関数は、htmlspecialchars関数よりも処理が遅くなる可能性があるため、パフォーマンスが重要な場合は、必要に応じて使い分けることが重要です。

基本的な使い方

構文(syntax)

htmlentities ( string $string , int $flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401 , ?string $encoding = null , bool $double_encode = true ) : string

引数(parameters)

string $string, int $flags = ENT_COMPAT | ENT_HTML401, ?string $encoding = null, bool $double_encode = true

  • string $string: HTMLエンティティに変換する文字列
  • int $flags = ENT_COMPAT | ENT_HTML401: エンティティ変換の挙動を指定するフラグ
  • ?string $encoding = null: 文字エンコーディングを指定する文字列。nullの場合は内部エンコーディングを使用
  • bool $double_encode = true: 既にエンティティ化されている文字も再度エンティティ化するかどうかを指定する真偽値

戻り値(return)

string

HTMLエンティティに変換された文字列を返します。

サンプルコード

PHP: htmlentitiesとhtmlspecialcharsの違いを理解する

<?php

declare(strict_types=1);

/**
 * htmlentities と htmlspecialchars の違いを示すサンプルコードです。
 *
 * この関数は、HTML特殊文字とアクセント記号付き文字を含む文字列を
 * それぞれの関数で処理し、結果の違いを出力します。
 *
 * @return void
 */
function demonstrateHtmlEncodingDifferences(): void
{
    // 比較対象の文字列を定義します。
    // HTMLの予約文字 (<, >, &, ", ') と、HTMLエンティティに変換可能な非ASCII文字 (é, à, ç) を含みます。
    $originalString = "これは 'テスト' です。<b>HTML</b> & 特殊文字 <script>alert(\"XSS\");</script> および éàç (アクセント記号付き文字) を含みます。";

    echo "元の文字列:\n";
    echo $originalString . "\n\n";

    // htmlspecialchars の適用
    // htmlspecialchars は、HTMLの予約文字 (&, ", ', <, >) のみをHTMLエンティティに変換します。
    // その他の文字(例: アクセント記号付き文字)は変換されず、そのまま残ります。
    // ENT_QUOTES はシングルクォートとダブルクォートの両方を変換します。
    // ENT_HTML5 はHTML5のルールに従います。
    $htmlspecialcharsResult = htmlspecialchars($originalString, ENT_QUOTES | ENT_HTML5, 'UTF-8');

    echo "htmlspecialchars の結果:\n";
    echo $htmlspecialcharsResult . "\n\n";

    // htmlentities の適用
    // htmlentities は、HTMLの予約文字に加えて、HTMLエンティティとして定義されているすべての文字をHTMLエンティティに変換します。
    // 例えば、アクセント記号付き文字 (é, à, ç) も &eacute; &agrave; &ccedil; のように変換されます。
    // フラグとエンコーディングは htmlspecialchars と同じ設定を使用し、関数の違いを明確にします。
    $htmlentitiesResult = htmlentities($originalString, ENT_QUOTES | ENT_HTML5, 'UTF-8');

    echo "htmlentities の結果:\n";
    echo $htmlentitiesResult . "\n\n";
}

// 関数を実行
demonstrateHtmlEncodingDifferences();

このPHPサンプルコードは、htmlentities関数とhtmlspecialchars関数の主な違いを明確に示しています。htmlentitiesは、文字列中のHTML予約文字(<, >, &, ", ')に加えて、アクセント記号付き文字(é, à, çなど)のようにHTMLエンティティとして定義されているすべての文字を、対応するHTMLエンティティに変換する関数です。これにより、Webページに表示する際に意図しないHTMLタグの解釈を防ぎ、クロスサイトスクリプティング(XSS)などのセキュリティリスクを低減します。

htmlentities関数の最初の引数$stringには変換したい元の文字列を渡し、第二引数$flagsには変換の挙動を制御するオプション(例えばENT_QUOTESを指定するとシングルクォートとダブルクォートの両方が変換されます)を指定します。第三引数$encodingには文字列のエンコーディング(通常はUTF-8)を設定します。この関数は、変換された文字列を戻り値として返します。

サンプルコードでは、「これは 'テスト' です。<b>HTML</b> & 特殊文字 <script>alert(\"XSS\");</script> および éàç (アクセント記号付き文字) を含みます。」という文字列を両関数で処理し、結果を比較しています。htmlspecialcharsの結果では、<&lt;に、"&quot;に変換されますが、éなどのアクセント記号付き文字はそのまま残ります。一方、htmlentitiesの結果では、これらHTML予約文字の変換に加え、é&eacute;のようにHTMLエンティティに変換されます。この違いは、表示する文字の種類やセキュリティ要件に応じて適切な関数を選択する上で重要です。

htmlentities関数は、HTMLの予約文字に加えて、アクセント記号付き文字などHTMLエンティティとして定義されている全ての文字を変換します。一方、htmlspecialchars関数は、HTMLの予約文字(<, >, &, ", ')のみを変換する点が大きな違いです。

ウェブページにユーザーの入力を表示する際のXSS(クロスサイトスクリプティング)対策としては、通常htmlspecialcharsで十分であり、不必要な変換によるコードの肥大化を避けられます。すべての文字をエンティティ化したい特別な場合を除き、htmlspecialcharsの利用が推奨されることが多いです。

どちらの関数も、引数として渡すエンコーディング(通常はUTF-8)を正しく指定しないと、文字化けの原因となります。セキュリティを確保するため、ユーザーからの入力をHTML出力に用いる際は、必ず適切なエスケープ処理を行うように注意してください。

htmlentitiesでXSSを防ぎ安全なHTMLを生成する

<?php

/**
 * 与えられた文字列をHTMLエンティティに変換し、安全なHTML出力を生成します。
 *
 * "htmlentitiesが機能しない"という問題は、多くの場合、
 * 入力文字列の実際のエンコーディングと、`htmlentities`関数に指定するエンコーディングが
 * 一致しない場合に発生します。
 *
 * この関数では、エンコーディングを明示的に 'UTF-8' に指定することで、
 * この一般的な問題を回避し、日本語や特殊記号を含む様々な文字セットを正しく処理します。
 * また、クロスサイトスクリプティング (XSS) などのセキュリティ脆弱性を防ぐために、
 * HTML特殊文字を適切にエスケープします。
 *
 * @param string $inputString 変換する元の文字列。この文字列はUTF-8エンコーディングであると仮定します。
 * @return string HTMLエンティティに変換された文字列。
 */
function generateSafeHtmlOutput(string $inputString): string
{
    // htmlentitiesが「機能しない」と感じられる最も一般的な原因は、エンコーディングの不一致です。
    // PHP 8では$encoding引数を省略するとphp.iniのdefault_charsetが使用されますが、
    // 明示的に'UTF-8'を指定することで、意図しない挙動を防ぎ、堅牢性を高めます。
    //
    // ENT_QUOTES: シングルクォートとダブルクォートの両方をHTMLエンティティに変換します。
    //             これにより、HTML属性値内で使われた引用符も安全にエスケープされます。
    // ENT_HTML5: HTML5のルールに基づいてエンティティを生成します。
    // double_encode: デフォルトでtrueであり、既にHTMLエンティティ化された文字列(例: &amp;)は
    //                再変換されません(例: &amp;amp;とはならない)。
    //                これはほとんどの場合、望ましい挙動です。
    return htmlentities($inputString, ENT_QUOTES | ENT_HTML5, 'UTF-8');
}

// --- 以下はサンプルコードの実行例 ---

// 1. HTMLタグや特殊文字を含む文字列の変換
$htmlExample = "<script>alert('Hello & World!');</script>";
echo "元の文字列: " . $htmlExample . "\n";
echo "変換後:     " . generateSafeHtmlOutput($htmlExample) . "\n\n";

// 2. 日本語やその他の多バイト文字、特殊記号を含む文字列の変換
//    (この文字列はUTF-8エンコーディングであると仮定します)
$multibyteExample = "こんにちは世界!Café & Müsli 123 < > \" '";
echo "元の文字列: " . $multibyteExample . "\n";
echo "変換後:     " . generateSafeHtmlOutput($multibyteExample) . "\n\n";

// 3. ユーザー入力など、Webページに表示する可能性のある文字列
$userInput = "ユーザーからの入力: <b>重要な情報</b> & 価格は100円です。";
echo "元の文字列: " . $userInput . "\n";
echo "変換後:     " . generateSafeHtmlOutput($userInput) . "\n\n";

?>

PHPのhtmlentities関数は、文字列に含まれるHTML特殊文字をHTMLエンティティに変換することで、ウェブページに安全な出力を生成する機能を提供します。これにより、クロスサイトスクリプティング(XSS)などのセキュリティ脆弱性を防ぐことができます。

htmlentitiesが機能しない」と感じられる一般的な原因は、入力文字列の実際のエンコーディングと、関数に指定するエンコーディングが一致しないことです。この問題を解決するためには、第三引数$encodingに明示的に'UTF-8'を指定することが非常に重要です。PHP 8ではこの引数を省略するとphp.inidefault_charsetが使用されますが、'UTF-8'を明示することで、日本語のような多バイト文字や特殊記号を含む様々な文字セットを確実に正しく処理し、堅牢性を高めます。

この関数は、第一引数$stringに変換したい元の文字列を受け取ります。第二引数$flagsには変換の挙動を制御する定数を指定し、例えばENT_QUOTESはシングルクォートとダブルクォートの両方をエンティティ化し、ENT_HTML5はHTML5のルールに従って変換します。第四引数$double_encodeは、既にHTMLエンティティ化された文字を再変換するかどうかを決定しますが、通常はデフォルトのtrueで問題ありません。関数は変換された文字列を戻り値として返します。

サンプルコードでは、htmlentities関数にENT_QUOTES | ENT_HTML5フラグと'UTF-8'エンコーディングを明示的に指定することで、<script>タグなどのHTMLタグ、日本語、特殊記号が適切にエンティティに変換され、安全なHTML出力が生成されることを示しています。

htmlentities関数は、クロスサイトスクリプティング(XSS)対策として、HTML特殊文字を安全にエンティティに変換するために使用します。この関数が「機能しない」と感じる最も一般的な原因は、入力文字列の実際のエンコーディングと、第三引数に指定するエンコーディング(例:'UTF-8')が一致しないことです。必ず入力文字列のエンコーディングを確認し、関数に明示的に指定してください。第二引数にはENT_QUOTES | ENT_HTML5を指定することで、シングルクォートやダブルクォートも変換され、HTML5標準に準拠したより堅牢なHTML出力を生成できます。第四引数の$double_encodeは通常trueのままで問題ありません。既にエンティティ化された文字が二重に変換されることを防ぎます。

【PHP8.x】htmlentities関数の使い方 | いっしー@Webエンジニア