PHP で html を出力するする際、htmlspecialchars() を使ってクロスサイトスクリプティング(XSS)対策を行うのは基本的ですが、printf() や sprintf() で出力をする場合全ての値に htmlspecialchars() を行うと可読性が著しく下がってしまうので、特殊文字を変換した上で printf()、sprintf() をするための関数を作ってみました。
<?php
printfh('<a href="%s" class="%s">%s</a>',
'https://php-archive.net','sample', '<test>');
function printfh(){
$args = func_get_args();
$text = array_shift($args);
$args = array_map('h', $args);
vprintf($text, $args);
}
function sprintfh(){
$args = func_get_args();
$text = array_shift($args);
$args = array_map('h', $args);
return vsprintf($text, $args);
}
function h($str, $encoding=null){
if(empty($encoding)) $encoding = mb_internal_encoding();
$str = htmlspecialchars($str, ENT_QUOTES, $encoding);
return $str;
}
実行結果:
<a href="https://php-archive.net" class="sample"><test></a>
使い方は printf() などとほぼ同じです。
第一引数にフォーマットを記入し、第二引数以降に代入する文字を追加していきます。(可変長引数)
