我想处理我的用户输入,以仅允许某些html标记,并用其html实体替换其他标记,以及替换非标记字符。例如,如果我只想允许<b>
和<a>
标签,那么
allow_only("This is <b>bold</b> and this is <i>italic</i>.
Moreover 2<3 and <a href='google.com'>this is a link</a>.","<b><a>");
应该产生
This is <b>bold</b> and this is <i>italic</i>.
Moreover 2<3 and <a href='google.com'>this is a link</a>.
如何在PHP中做到这一点?我知道strip_tags()
这可以完全删除不需要的标签,并且我知道htmlspecialchars()
可以用html实体替换所有标签,但是不能替换仅特定标签的标签。如何在PHP中完成?
并且,如果没有“通用”方法来执行此操作,那么一般而言,我应该如何继续处理可能具有有效常规html但也可能带有<
标志和潜在危险html代码的用户输入?
应用htmlspecialchars,然后将给定标签数组的编码实体替换为常规实体
function allow_only($str, $allowed){
$str = htmlspecialchars($str);
foreach( $allowed as $a ){
$str = str_replace("<".$a.">", "<".$a.">", $str);
$str = str_replace("</".$a.">", "</".$a.">", $str);
}
return $str;
}
echo allow_only("This is <b>bold</b> and this is <i>italic</i>.", array("b"));
这适用于简单的标签,返回“这是粗体字,是<i>斜体字</ i>”。
如前所述,这不适用于带有属性的标签,但是可以:
function fix_attributes($match){
return "<".$match[1].str_replace('"','"',$match[2]).">";
}
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 <b>bold</b> and <a href="http://www.#links">this</a> is <i>italic</i>.', array("b","a"));
可以处理具有某些属性的更复杂的标记,因此,仅[]
允许在它们之间列出的字符出现在属性中。不幸的是"
必须在属性中允许它使用,否则它将不起作用,并且也允许所有其他实体使用-但是仅"
在属性中将被解码。
如所建议的,使用http://htmlpurifier.org/demo.php之类的库来解决这种问题的更好(更安全,更干净)的方法
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句