preg_replace div(或任何东西)与 class=removeMe

发布于 2024-10-20 04:57:00 字数 362 浏览 1 评论 0 原文

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

是否有可能做到这一点?

任何帮助表示赞赏!担。

just trying to remove some elements with preg_replace but can't get it to work consistently. I would like to remove an element with matching class. Problem is the element may have an ID or several classes.

ie the element could be

<div id="me1" class="removeMe">remove me and my parent</div> 

or

<div id="me1" class="removeMe" style="display:none">remove me and my parent</div>

is it possible to do this?

any help appreciated! Dan.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

笑看君怀她人 2024-10-27 04:57:00

我同意 MarcB 的观点。总的来说,在操作 HTML 时最好使用 DOM。但这里有一个基于 smottt 答案的正则表达式可能有效:

$html = preg_replace('~<div([^>]*)(class\\s*=\\s*["\']removeMe["\'])([^>]*)>(.*?)</div>~i', '', $html);
  • 使用 [^>]*[^<]* 而不是 .*.在我的测试中,.*? 不起作用。如果不匹配的 div 出现在匹配的 div 之前,则它将匹配第一个 div、中间的所有内容以及最后一个 div。例如,它错误地匹配整个字符串:

    hello

    bar

  • 考虑到您可以对 HTML 属性使用单引号。
  • 另请记住,等号周围可以有空格。
  • 您也应该使用“m”修饰符,以便考虑换行符(请参阅此页面

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

编辑:实际上,没关系,“m”修饰符不会做任何事情。
EDIT2:改进了正则表达式,但如果 div 中有任何换行符,它仍然会失败。

I agree with MarcB. Overall, it's better to use a DOM when manipulating HTML. But here is a regex based on smottt's answer that might work:

$html = preg_replace('~<div([^>]*)(class\\s*=\\s*["\']removeMe["\'])([^>]*)>(.*?)</div>~i', '', $html);
  • Use [^>]* and [^<]* instead of .*. In my testing, .*? doesn't work. If a non-matching div comes before a matching div, it will match the first div, everything in between, and the last div. For example, it incorrectly matches against this entire string: <div></div><b>hello</b><div class="removeMe">bar</div>
  • Take into account the fact that you can use single quotes with HTML attributes.
  • Also remember that there can be whitespace around the equals sign.
  • You should use the "m" modifier too so that it takes line breaks into account (see this page).

I added parenthesis for clarity, but they aren't needed. Let me know if this works or not.

EDIT: Actually, nevermind, the "m" modifier won't do anything.
EDIT2: Improved the regex, but it still fails if there are any newlines in the div.

静谧幽蓝 2024-10-27 04:57:00

虽然这对于正则表达式仍然可行,但使用例如 QueryPath 则要简单得多:

print qp($html)->find(".removeMe")->parent()->remove()->writeHTML();

While this is still doable with regular expression, it's much simpler with e.g. QueryPath:

print qp($html)->find(".removeMe")->parent()->remove()->writeHTML();
装纯掩盖桑 2024-10-27 04:57:00

使用 preg_replace:

preg_replace('~<div([^>]*)class="(.*?)gallery(.*?)">(.*?)</div>~im', '', $html);

With preg_replace:

preg_replace('~<div([^>]*)class="(.*?)gallery(.*?)">(.*?)</div>~im', '', $html);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文