如何使用PHP删除* some * inline CSS,但不是全部?

时间:2011-12-07 15:16:26

标签: php regex

PHP regex / PHP DOM / PHP XPath问题。

给出以下带有内联CSS的HTML:

<p style='text-indent: 22px; font-weight: bold; line-height: 1em; color: #FFF'>

如何删除'line-height'和'color'CSS属性,并保持text-indent和font-weight不变,因此生成的HTML为:

<p style='text-indent: 22px; font-weight: bold;'>

HTML文件可能有数百行,各种标记嵌套和其他属性应用于任何标记。

请注意,'style'属性可能会应用于<p>

以外的其他标签

我知道有使用PHP DOM和正则表达式的方法 - 我目前的想法是使用这些方面的东西:

$elements = $xPath->query('//*[@style="color"]');
foreach ($elements as $element) {   
  //remove style='color'
}

非常感谢

修改

这是我的解决方案:

https://github.com/sabberworm/PHP-CSS-Parser

创建:

$dom = new DOMDocument;
@$dom->loadHTML('<?xml encoding="UTF-8">' . $html);
$xPath = new DOMXPath($dom);
$elements = $xPath->query('//p|//span');
foreach($elements as $element){
    $oParser = new CSSParser("p{" . $element->getAttribute('style') . "}");
    $oCss = $oParser->parse();
    foreach($oCss->getAllRuleSets() as $oRuleSet) {
        $oRuleSet->removeRule('line-');
        $oRuleSet->removeRule('margin-');
        $oRuleSet->removeRule('font-');
    }
    $css = $oCss->__toString();
    $css = substr_replace($css, '', 0, 3);
    $css = substr_replace($css, '', -1, 1);
    $element->setAttribute('style', $css);
}
$src = $dom->saveHTML();

1 个答案:

答案 0 :(得分:3)

绝对使用正确的HTML和CSS解析器而不是正则表达式。对于XPath查询,使用contains函数查找要更改的节点:

//*[contains(@style, 'color:')]

然后使用CSS解析器删除您不想要的属性。