我是 Regex 的新手,但我认为这是我需要做的事情的最简单途径。基本上我有一个字符串(在 PHP 中),其中包含一整套 HTML 代码......我想删除任何具有 style=display:none 的标签......

所以例如
<img src="" style="display:none" /><img src="" style="width:11px;display: none" >
等等...

到目前为止,我的正则表达式是:
<img.*style=.*display.*:.*none;.* >
但这似乎留下了一些 html,并且在带有 preg_replace 的 php 中使用时也会带走下一个元素。

最佳答案

Like Michael pointed out ,您不想为此目的使用正则表达式。正则表达式不知道元素标签是什么。 <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();

现在我们查询包含文本“display”的“style”属性的所有“IMG”元素的DOM。我们可以在 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 感兴趣

关于php - 正则表达式从 Html 中删除带有样式标签的图像,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2772782/

10-15 15:09