正则表达式从Html中删除带有样式标记的图像

时间:2010-05-05 11:40:05

标签: php regex

我是Regex的新手,但我认为这是我需要做的最简单的路线。基本上我有一个字符串(在PHP中),其中包含一大堆HTML代码...我想删除任何有style = display:none ...

的标签

所以例如

<img src="" style="display:none" />

<img src="" style="width:11px;display: none" >

等...

到目前为止,我的正则表达式是:

<img.*style=.*display.*:.*none;.* >

但是这似乎留下了一些html,并且当在php中使用preg_replace时,也会使用下一个元素。

5 个答案:

答案 0 :(得分:4)

Like Michael pointed out,您不希望将Regex用于此目的。正则表达式不知道元素标记是什么。 <foo>>foo<一样有意义,除非你教导它的不同之处。然而,教导差异是非常乏味的。

DOM更方便:

$html = <<< HTML
<img src="" style="display:none" />
<IMG src="" style="width:11px;display: none" >
<img src="" style="width:11px" >
HTML;

以上是我们的(无效)标记。我们像这样将它提供给DOM:

$dom = new DOMDocument();
$dom->loadHtml($html);
$dom->normalizeDocument();

现在我们在DOM中查询包含“style”属性的所有“IMG”元素,该属性包含文本“display”。我们可以在XPath中查询“display:none”,但是我们的输入标记出现了,中间没有空格:

$xpath = new DOMXPath($dom);
foreach($xpath->query('//img[contains(@style, "display")]') as $node) {
    $style = str_replace(' ', '', $node->getAttribute('style'));
    if(strpos($style, 'display:none') !== FALSE) {
        $node->parentNode->removeChild($node);
    }
}

我们遍历IMG节点并从其样式属性内容中删除所有空格。然后我们检查它是否包含“display:none”,如果是,则从DOM中删除该元素。

现在我们只需要保存我们的HTML:

echo $dom->saveHTML();

给我们:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><img src="" style="width:11px"></body></html>

螺丝正则表达式!


附录:您可能也对Parsing XML documents with CSS selectors

感兴趣

答案 1 :(得分:3)

$html = preg_replace("/<img[^>]+style[^>]+none[^>]+>/", '', $html);

答案 2 :(得分:0)

因为<img>不允许其中的任何其他元素,这是可能的;但一般来说,regexp是一个非常糟糕的工具,用于解析像HTML这样的递归定义语言。

无论如何,你可能遇到的问题是关闭&gt;正在被。*表达式中的一个匹配,并且碰巧有一个稍后的&gt;在与您的明确&gt;匹配的行上

如果您用[^&gt;] *替换所有。*将阻止这种情况。 (他们可能不会所有需要更换,但你也可以)。

答案 3 :(得分:0)

你的正则表达方式过于宽泛; .*表示“匹配任何内容”,因此匹配:

<img src="foo.png" style="something">Some random displayed text : foo none; bar<br>

至少,您可能希望从匹配项中排除结束括号,因此[^>]*代替.*。您也可以阅读this,并考虑使用实际理解HTML的内容,例如DOMDocument

答案 4 :(得分:0)

这里是另一种版本,适用于所有标签,包括内嵌样式 display:none display:none 之间带有空格的标签。加上它会删除标签内的内容。

$html = preg_replace('/<[^>]+style[^>]+display:\s*none[^>]+>.*?>/', '', $html);

所以我已经用以下方法对其进行了测试,并且效果很好。

Only show<div style='display:none'>Delete inside content as well</div> this text.

Only show<span style='display: none'>Delete inside content as well</span> this text.

Only show<div style="display: none">Delete inside content as well</div> this text.

Only show<span style="display:none;">Delete inside content as well</span> this text.

现在应该只输出。

Only show this text.