php htmlspecialcharsでHTMLエンティティ化する

  • 作成日 2021.10.10
  • php
php htmlspecialcharsでHTMLエンティティ化する

phpで、htmlspecialcharsを使用して、HTMLエンティティ化するサンプルコードを記述してます。phpのバージョンは8.0です。

環境

  • OS  CentOS Linux release 8.0.1905 (Core)
  • php 8.0.0
  • nginx 1.14.1

htmlspecialchars使い方

htmlspecialcharsを使用すれば、HTMLエンティティ化することが可能です。

$result = htmlspecialchars(
文字列,
変換する種類 デフォルト:ENT_COMPAT | ENT_HTML401,
エンコード デフォルト:ini_get("default_charset"),
既存のhtmlエンティティをエンコードするか:デフォルト TRUE);

使用できる第二引数は以下となります。

  • ENT_COMPAT : ダブルクォートを含めシングルクォートは含めない
  • ENT_QUOTES : ダブルクォートとシングルクォートの両方を含める
  • ENT_NOQUOTES : ダブルクォートとシングルクォートの両方を含めない
  • ENT_IGNORE : 基本使用しない。無効な符号単位シーケンスを含む文字列を渡した場合に、 空の文字列を返すのではなく無効な部分を切り捨てる。
  • ENT_SUBSTITUTE : 無効な符号単位シーケンスを含む文字列を渡した場合に、 空の文字列を返すのではなく Unicode の置換文字に置き換えられる。 UTF-8 の場合は U+FFFD、それ以外の場合は &#FFFD; となります。
  • ENT_DISALLOWED : 指定した文書型において無効な符号位置を、Unicode の代替文字である U+FFFD (UTF-8) あるいは &#FFFD; で置き換えられる。 これを設定しなければ、無効な符号位置をそのまま残る。
  • ENT_XML1 : XML 1
  • ENT_XHTML : XHTML
  • ENT_HTML5 : HTML 5

htmlspecialcharsの基本的な変換テーブルは以下となります。

var_dump(get_html_translation_table(HTML_SPECIALCHARS, ENT_QUOTES));

array(5) {
  '"' =>
  string(6) """
  '&' =>
  string(5) "&"
  '\'' =>
  string(6) "'"
  '<' =>
  string(4) "&lt;"
  '>' =>
  string(4) "&gt;"
}

以下は、HTMKをHTMLエンティティ化サンプルコードとなります。

<?php

$str = "<a href=\"https://mebee.info/\">link</a>";

$result = htmlspecialchars($str);

print_r($result); // &lt;a href=&quot;https://mebee.info/&quot;&gt;link&lt;/a&gt;

元のhtmlに戻す場合は、htmlspecialchars_decodeを使用します。

<?php

$str = "&lt;a href=&quot;https://mebee.info/&quot;&gt;link&lt;/a&gt;";

$result = htmlspecialchars_decode($str);

print_r($result); // <a href="https://mebee.info/">link</a>

また「&amp;」を変換した場合「&」が「&amp;」に変換されて「&amp;amp;」となるので、

<?php

$str = "&amp;";

$result = htmlspecialchars($str);

print_r($result); // &amp;amp;

第四引数を「false」に指定することにより「&amp;」と表示されます。

<?php

$str = "&";

$result = htmlspecialchars($str, ENT_COMPAT | ENT_HTML401,ini_get("default_charset"),false);

print_r($result); // &