php の htmlentities( ) と htmlspecialchars( )

24 12月

php で XML を利用していて,データをタグの中に書き込むときに,注意すべきことを記録します。下記は最初テキストで XML 要素を作り上げて,そのあとで XML に追加するようなコードです。

$tmpstr = '';
$tmpstr = $tmpstr."<question>\n";
$tmpstr = $tmpstr."<num>".htmlentities($i + 1)."</num>\n";
$tmpstr = $tmpstr."<AnswerTest>".htmlentities($AnswerTest)."</AnswerTest>\n";
$tmpstr = $tmpstr."<SAns>".htmlspecialchars($SAns, ENT_QUOTES)."</SAns>\n";
$tmpstr = $tmpstr."<appearance>".htmlspecialchars($appearance, ENT_QUOTES)."</appearance>\n";
$tmpstr = $tmpstr."</question>\n\n";
$returnXML = addXMLElement($returnXML, $tmpstr);

htmlentities() をかけておけば良いかと思っていたのですが(上記のコードは修正済みのもの),それでは,XML として解釈する際に,エラーが生じる場合があります。例えば “✕” は “&times;” に変換されますが,この “&” がひっかかります。”&” を変換した “&amp;” の中の “&” は大丈夫なのですが。XML で対応する範囲外のものまで変換しているようです。それで,変換要素が少ない htmlspecialchars() を利用するように変更しました。これならば,今のところ大丈夫そうです。