preg_replace div(或任何)与class = removeMe

时间:2011-03-01 18:02:32

标签: php html preg-replace

只是尝试使用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>

可以这样做吗?

任何帮助表示赞赏!丹。

3 个答案:

答案 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>
  • 考虑到您可以使用带有HTML属性的单引号这一事实。
  • 还要记住,等号周围可能有空格。
  • 您也应该使用“m”修饰符,以便将换行符考虑在内(请参阅this page

为了清楚起见,我添加了括号,但不需要它们。让我知道这是否有效。

编辑:实际上,没关系,“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);