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();
答案 0 :(得分:3)
绝对使用正确的HTML和CSS解析器而不是正则表达式。对于XPath查询,使用contains
函数查找要更改的节点:
//*[contains(@style, 'color:')]
然后使用CSS解析器删除您不想要的属性。