如何删除domElement的style属性的特定样式属性?

时间:2017-05-31 13:19:07

标签: php recursion domdocument

我在PHP中有一个DomElement。我想从元素及其所有子元素的样式属性中删除一些特定样式。我知道它应该是递归的。

例如我有:

<a href="" style="top:10px;left:4px;margin:4px"><img style="top:3px"/></a>

我删除top样式。它转换为:

<a href="" style="left:4px;margin:4px"><img style=""/></a>

2 个答案:

答案 0 :(得分:0)

使用JQUERY

尝试以下代码
{{1}}

答案 1 :(得分:0)

对父节点使用以下函数:

 private function prevent_html_style_properties($element){
    if($element->nodeType != XML_ELEMENT_NODE)
        return $element;
    $element->removeAttribute('class');
    if($element->hasAttribute('style')){
        $style = $element->getAttribute('style');
        $existingDeleteAttrList = array();
        $attrList = [
            'height',
            'position',
            'top'];
        $style_parts = explode(';', $style);
        foreach($attrList as $attr){
            if(strpos($style, $attr) !== false)
                $existingDeleteAttrList[] = $attr;
        }
        $new_attr_value = '';
        foreach($style_parts as $style_part){
            $attr_is_safe = true;
            foreach($existingDeleteAttrList as $attr){
                if(strpos($style_part, $attr) !== false) {
                    $attr_is_safe = false;
                    break;
                }
            }
            if($attr_is_safe)
                $new_attr_value .= $style_part . ';';
        }
        $element->setAttribute('style', $new_attr_value);
    }

    $children  = $element->childNodes;
    foreach ($children as $child)
    {
        $element->replaceChild($this->prevent_html_tag_styles($child), $child);
    }
    return $element;
}

用法:

 $element = $this->prevent_html_style_properties($element);

一些解释:

  • 有些孩子是简单的文字,没有任何属性。所以我们必须检查它是否是XML_ELEMENT_NODE
  • 它使用replaceChild来修复其直接子项,依此类推。