php删除不包含内容的html标签

时间:2014-09-12 16:01:50

标签: php html regex html-parsing

我正在显示内容(一个名为$ 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>

我怀疑如果空的东西看起来有点不同,它将无法可靠地工作。

您能帮助我构建一个我可以轻松实现的更好的解决方案吗?也许正则表达式有效,不像我到目前为止的尝试......

谢谢!

2 个答案:

答案 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);