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

Php 正则表达式从Html中删除带有样式标记的图像,php,regex,Php,Regex,我对Regex还不熟悉,但我认为这是我需要做的最简单的方法。基本上,我有一个字符串(在PHP中),它包含了一大堆HTML代码。。。我想删除任何具有style=display:none的标记 比如说 等等 到目前为止,我的正则表达式是: 但这似乎留下了一些html,并且在php中使用preg_replace时也带走了下一个元素 因为不允许任何其他元素在其中,所以这是可能的;但总的来说,对于解析递归定义的语言(如HTML),regexp是一个非常糟糕的工具 无论如何,您可能遇到的问题是关闭>与

我对Regex还不熟悉,但我认为这是我需要做的最简单的方法。基本上,我有一个字符串(在PHP中),它包含了一大堆HTML代码。。。我想删除任何具有style=display:none的标记

比如说



等等

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



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

因为
不允许任何其他元素在其中,所以这是可能的;但总的来说,对于解析递归定义的语言(如HTML),regexp是一个非常糟糕的工具

无论如何,您可能遇到的问题是关闭>与其中一个.*表达式匹配,而行中恰好有一个稍后的>与显式>匹配

如果您将所有的.*替换为[^>]*,这将防止出现这种情况。(它们可能不需要全部更换,但您也可以这样做)

$html=preg_replace(“/]+style[^>]+none[^>]+>/”,“”,$html);

您的正则表达式太宽了
*
表示“匹配任何内容”,因此这将匹配:

<img src="foo.png" style="something">Some random displayed text : foo none; bar<br>
一些随机显示的文本:foo none;酒吧

至少,您可能希望从匹配中排除右括号,因此
[^>]*
而不是
*
。不过,您可能还想阅读并研究如何使用真正理解HTML的东西,如

,您不想为此使用正则表达式。正则表达式不知道元素标记是什么
与foo一样有意义这里有另一个版本,它可以处理所有标签,包括在内联样式display:nonedisplay:none之间带有空格的标签。此外,它还会删除标记中的内容

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

谢谢,很好。。。不知道你是怎么想出来的,但是很管用!这将匹配任何IMG元素和样式中包含单词“none”的任何css属性,包括
边框样式:none]display:\s*none[^>]+>/”,“”,$html)<代码>
谢谢,我没有意识到php中内置了dom解析(尽管我应该猜到还有一个用于其他所有功能的函数)。。。你的建议是有效的,即使是不寻常的图像…需要注意的是,经过一段时间的测试后,如果“显示”是大写的,它就不起作用了。。。对xpath使用:[contains(translate(@style,'abcdefghijklmnopqrstuvxyz','abcdefghijklmnopqrstuvxyz'),“display”)]instead@Mark您还可以使用和使用
strotolower
stripos
$html = <<< HTML
<img src="" style="display:none" />
<IMG src="" style="width:11px;display: none" >
<img src="" style="width:11px" >
HTML;
$dom = new DOMDocument();
$dom->loadHtml($html);
$dom->normalizeDocument();
$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);
    }
}
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>
$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.