strip_tags:剥离凌乱的标签和样式

时间:2011-07-22 15:20:20

标签: php html regex preg-replace strip-tags

如何剥离某些html标签并允许其中一些?

例如,

我想剥离span代码,但允许带有下划线的span

<span style="text-decoration: underline;">Text</span>

我想允许p,但我想删除p中的所有样式或类,例如

<p class="99light">Text</p>应删除p标记内的类 - 我只想要一个干净的p标记。

这是我到目前为止的路线,

strip_tags($content, '<p><a><br><em><strong><ul><li>');

2 个答案:

答案 0 :(得分:1)

你做不到。您需要使用XML / HTML解析器来执行此操作:

// with DOMDocument it might look something like this.
$dom = new DOMDocument();
$dom->loadHTML( $content );
foreach( $dom->getElementsByTagName( "p" ) as $p )
{
    // removes all attributes from a p tag.
    /*
    foreach( $p->attributes as $attrib )
    {
        $p->removeAttributeNode( $attrib );
    }
    */
    // remove only the style attribute.
    $p->removeAttributeNode( $p->getAttributeNode( "style" ) );
}
echo $dom->saveHTML();

答案 1 :(得分:0)

您需要完整的DOM解析。 strip_tags不会提供必要的安全性和自定义。我过去曾使用HTMLPurifier库来实现此目的。它实际解析并允许您设置白名单,同时处理恶意输入并生成有效的标记!

通过“必要的安全性”我的意思是,如果你试图编写一个自定义解析器,你会犯一个错误(不用担心,我也会)和“自定义”我的意思是没有内置的解决方案会让你瞄准只有具有某些属性和某些属性值的某些标签。 HTMLPurifier是PHP库解决方案。