虽然 regex 可以完成这项任务,但通常鼓励使用 DOM 函数进行过滤或其他 HTML 操作。这是一个可重用的类,它使用 DOM 方法删除不需要的属性。您只需设置所需的 HTML 标记和属性,它就会过滤掉不需要的 HTML 部分。
class allow_some_html_tags {
var $doc = null;
var $xpath = null;
var $allowed_tags = "";
var $allowed_properties = array();
function loadHTML( $html ) {
$this->doc = new DOMDocument();
$html = strip_tags( $html, $this->allowed_tags );
@$this->doc->loadHTML( $html );
$this->xpath = new DOMXPath( $this->doc );
}
function setAllowed( $tags = array(), $properties = array() ) {
foreach( $tags as $allow ) $this->allowed_tags .= "<{$allow}>";
foreach( $properties as $allow ) $this->allowed_properties[$allow] = 1;
}
function getAttributes( $tag ) {
$r = array();
for( $i = 0; $i < $tag->attributes->length; $i++ )
$r[] = $tag->attributes->item($i)->name;
return( $r );
}
function getCleanHTML() {
$tags = $this->xpath->query("//*");
foreach( $tags as $tag ) {
$a = $this->getAttributes( $tag );
foreach( $a as $attribute ) {
if( !isset( $this->allowed_properties[$attribute] ) )
$tag->removeAttribute( $attribute );
}
}
return( strip_tags( $this->doc->saveHTML(), $this->allowed_tags ) );
}
}
该类使用strip_tags
了两次——一次是为了快速消除不需要的标签,然后在从剩余的属性中删除后,它会消除由 DOM 函数(doctype、html、body)插入的附加标签。要使用,只需执行以下操作:
$comments = new allow_some_html_tags();
$comments->setAllowed( array( "p", "span", "ul", "li" ), array("tabindex") );
$comments->loadHTML( $str );
$clean = $comments->getCleanHTML();
setAllowed 函数采用两个数组 - 一组允许的标签和一组允许的属性(如果您以后决定要保留一些)。我已经更改了您的输入字符串,以在某处包含一个添加的 tabindex="1" 属性来说明过滤。$clean 的输出是:
<p>content</p>
<span>content</span>
<ul tabindex="3"></ul><li>content</li>