我正在显示内容(一个名为$ ps的字符串,填充了html),该内容已经在wysiwyg编辑器中编写(外部css未被使用)并包含空格,例如
<p>
<span style="font-family: Calibri, sans-serif; font-size: 11pt;">
<br></br>
</span>
<span style="font-size: 11pt; font-family: Calibri, sans-serif;">
</span>
</p>
我想用php删除(因为我希望作者继续不小心添加空的东西)。
到目前为止,我的代码非常低效:
$ps = preg_replace('#class="(.*?)"#', '',$ps);
$ps = preg_replace('#style="(.*?)"#', '',$ps);
$ps = preg_replace('#<br\s*/*>#i', '',$ps);
$ps = preg_replace('#<span\s*/*>#i', '',$ps);
$ps = preg_replace('#<p>\s*</p>#i', '',$ps);
大约只有一半的好处,留给我:
<p>
</p>
<p>
</p>
我怀疑如果空的东西看起来有点不同,它将无法可靠地工作。
您能帮助我构建一个我可以轻松实现的更好的解决方案吗?也许正则表达式有效,不像我到目前为止的尝试......
谢谢!
答案 0 :(得分:1)
我会使用DOMDocument而不是正则表达式:
$html = '<span style="font-family: Calibri, sans-serif; font-size: 11pt;">...';
$domd = new DOMDocument();
$domd->loadHTML($html);
$domx = new DOMXPath($domd);
$items = $domx->query("//*");
foreach($items as $item) {
$item->removeAttribute("style");
$item->removeAttribute("class");
}
echo $domd->saveHTML();
您还可以删除空节点或其他需要删除的节点。
答案 1 :(得分:0)
回应@ ovi答案中的评论,因为评论中的代码块很难看
您可以运行它,直到它不再从元素集中删除任何内容。如果它是一个很长的文档,这将继续拖动,但我想它会起作用。
例如
$changed = true;
while ($changed = true){
$changed = false;
foreach($items as $item) {
if (trim($item->nodeValue) == ''){
$item->parentNode->removeChild($item);
$changed = true;
}
}
}
我重申,这可能需要相当长的时间。另外,我还没有测试过$item->parentNode->removeChild($item);
。