只是尝试使用preg_replace删除某些元素但无法使其始终如一地工作。我想删除一个匹配类的元素。问题是元素可能有ID或几个类。
即元素可以是
<div id="me1" class="removeMe">remove me and my parent</div>
或
<div id="me1" class="removeMe" style="display:none">remove me and my parent</div>
可以这样做吗?
任何帮助表示赞赏!丹。
答案 0 :(得分:3)
我同意MarcB。总的来说,在操作HTML时最好使用DOM。但是这里有一个基于smottt答案的正则表达式可能有效:
$html = preg_replace('~<div([^>]*)(class\\s*=\\s*["\']removeMe["\'])([^>]*)>(.*?)</div>~i', '', $html);
[^>]*
和[^<]*
代替.*
。在我的测试中,.*?
不起作用。如果一个不匹配的div出现在匹配的div之前,它将匹配第一个div,中间的所有内容和最后一个div。例如,它错误地匹配整个字符串:<div></div><b>hello</b><div class="removeMe">bar</div>
为了清楚起见,我添加了括号,但不需要它们。让我知道这是否有效。
编辑:实际上,没关系,“m”修饰符不会做任何事情。 EDIT2:改进了正则表达式,但如果div中有任何换行符,它仍然会失败。
答案 1 :(得分:2)
虽然这对于正则表达式仍然可行,但它更简单,例如QueryPath:
print qp($html)->find(".removeMe")->parent()->remove()->writeHTML();
答案 2 :(得分:1)
使用preg_replace:
preg_replace('~<div([^>]*)class="(.*?)gallery(.*?)">(.*?)</div>~im', '', $html);