我是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时,也会使用下一个元素。
答案 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>
螺丝正则表达式!
答案 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.