使用php regex从html标记元素中删除属性

时间:2013-09-19 14:11:26

标签: php html regex

想删除html标签中的任何属性,我认为这可以使用正则表达式实现,但我不擅长使用正则表达式。

尝试使用str_replace,但这不是正确的方法。我搜索了类似的问题,但找不到任何问题。

示例:

在变量中得到这样的html标签:

$str = '
<p class="class_style" style="font-size: medium; line-height: normal; letter-spacing: normal;">content</p>
<span class="another_class_style" style="font-size: medium; line-height: normal; letter-spacing: normal;">content</span>
<ul class="another_class_style" style="background:#006;"></ul>
<li class="another_class_style" style=" list-style:circle; color:#930;">content</li>';

调用某些preg_match()

$new_str = preg_match('', $str)

预期输出:

$new_str = '
<p>content</p>
<span>content</span>
<ul></ul>
<li>content</li>';

请注意,我不打算剥离html标签,而只是需要删除标签中的任何标签元素。

php strip_tags() isn't an option

将不胜感激地获得帮助。

3 个答案:

答案 0 :(得分:1)

虽然正则表达式可以完成任务,但通常鼓励使用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>

答案 1 :(得分:0)

在php中删除html标签的最简单方法是strip_tags()

或者您可以通过

删除
preg_replace("/<.*?>/", "", $str);

答案 2 :(得分:0)

$str = '
<p class="class_style" style="font-size: medium; line-height: normal; letter-spacing: normal;">content</p>
<span class="another_class_style" style="font-size: medium; line-height: normal; letter-spacing: normal;">content</span>
<ul class="another_class_style" style="background:#006;"></ul>
<li class="another_class_style" style=" list-style:circle; color:#930;">content</li>';

$clean = preg_replace('/ .*".*"/', '', $str);

echo $clean;

将返回:

<p>content</p>
<span>content</span>
<ul></ul>
<li>content</li>

但是请不要使用正则表达式来解析HTML,使用DOM解析器。