PHP:删除特定标记但保留内容

时间:2014-09-02 16:40:04

标签: php regex dom

我只想在不存在类属性的情况下从html中删除特定的<font>标记。我已经尝试过使用下面的正则表达式:

/<font(.*?)>(.*?)<\/font>/

以及preg_replace(),但在我的情况下它不起作用,因为标签有时是嵌套的。

例如:

<font>
  <a><font class="junk"></font></a>
<font>

如果我运行正则表达式,它会变为:

  <a><font class="junk"></a>
<font>

由于第二个<font>标记上有一个类属性,因此不会删除该标记,并且可能会搞砸HTML。

我希望的结果如下:

<a><font class="junk"></font></a>

我希望<font>代码只有在没有class属性的情况下才能删除。

因此,我需要除了正则表达式以外的其他东西。我知道你不应该用正则表达式解析HTML(我知道Bobince写的是什么)。我也知道你可以加载DOMDocument。我从here得到的东西如下:

$dom = new DOMDocument();

然而,我见过的解决方案也剥离了标签之间的内容。我只想删除标签本身,但要保留内容。是否可以使用原生DOM?

2 个答案:

答案 0 :(得分:2)

您可以使用此正则表达式:

<font class.*?>.*?<\/font>(*SKIP)(*FAIL)|(<font>|<\/font>)

<强> Working demo

enter image description here

答案 1 :(得分:0)

抓住包含<font ...

的每一行

请注意<font的indexAt并删除其中的所有内容,直到之后的firstIndexOf >

(例如:

while(strpos($html,'<font')>-1 ) {
    $removeFrom = strpos($html,"<font");
    $removeTo = strpos($html,">",$removeFrom+1);
    $html = substr($html,0,$removeFrom).substr($html,$removeTo);
}

然后只需使用</font>

从所有地方删除所有str_replace('<\font>','',$html)

不像单个正则表达式那样光滑,但应该可以工作,只有几行实际代码。