应用htmlspecialchars,然后将给定标签数组的编码实体替换为常规实体
function allow_only($str, $allowed){
$str = htmlspecialchars($str);
foreach( $allowed as $a ){
$str = str_replace("<".$a.">", "", $str);
$str = str_replace("</".$a.">", "".$a.">", $str);
}
return $str;
}
echo allow_only("This is bold and this is italic.", array("b"));
这适用于简单的标签,返回“这是粗体字,并且是斜体字 i>”。
如前所述,这不适用于带有属性的标签,但是可以:
function fix_attributes($match){
return "";
}
function allow_only($str, $allowed){
$str = htmlspecialchars($str);
foreach( $allowed as $a ){
$str = preg_replace_callback("/<(".$a."){1}([\s\/\.\w=&;:#]*?)>/", fix_attributes, $str);
$str = str_replace("</".$a.">", "".$a.">", $str);
}
return $str;
}
echo allow_only('This is bold and this is italic.', array("b","a"));
使用某些属性处理更复杂的标签,因此只允许[]之间列出的字符出现在属性中。 不幸的是" 必须在属性内允许使用,否则它将不起作用,并且也允许所有其他实体使用-但是,仅"属性”将被解码。
如所建议的,使用http://htmlpurifier.org/demo.php之类的库来解决这种问题的更好(更安全,更干净)的方法