PHP - 字符串 - 删除具有特定类的 HTML 标记,包括其内容

Posted

技术标签:

【中文标题】PHP - 字符串 - 删除具有特定类的 HTML 标记,包括其内容【英文标题】:PHP - Strings - Remove a HTML tag with a specific class, including its contents 【发布时间】:2011-03-10 03:29:46 【问题描述】:

我有一个这样的字符串:

<div class="container">
  <h3 class="hdr"> Text </h3>
  <div class="main">
    text
    <h3> text... </h3>
    ....

  </div>
</div>

如何使用尽可能少的代码删除带有 .hdr 类的 H3 标签?

【问题讨论】:

作者是对的。他想发送没有那个 html 元素的输出。 javascript 修改它,但它不能存在。 好吧,我需要修改 Wordpress 函数的生成输出。 js 不是一个好方法... php regexp: remove all atributes from an html tag 的可能重复项 - 可以很容易地适应删除整个节点而不仅仅是属性。请参阅我的 DOM 解决方案。 Op 要求提供服务器端解决方案。我们知道 Jquery 总是答案...meta.stackexchange.com/questions/45176/… javascript 可能在用户电脑上被禁用。为什么该用户不应该看到该元素? 【参考方案1】:

尽可能使用 little 代码?最短的代码不一定是最好的。但是,如果您的 HTML h3 标签 always 看起来像这样,这就足够了:

$html = preg_replace('#<h3 class="hdr">(.*?)</h3>#', '', $html);

一般来说,虽然使用正则表达式来解析 HTML 并不是一个特别好的主意。

【讨论】:

谢谢,这行得通!但是为什么你使用正则表达式不是一个好主意?是因为它需要更多的cpu吗?我正在谈论的字符串可能非常大。它是一个函数的输出缓冲区,应该在屏幕上写一些东西 @Alex 因为 HTML 不规则。如果您想使用 HTML,请使用 DOM。链接副本中有一个示例。 在这种情况下,除了 div.main 中的内容之外的所有内容都是常规的 :) tx 也许你应该考虑 "/

(.*?)/i" "i" 只是为了忽略大小写

重要提示:仅当开始和结束标签在同一行时才有效!中间的换行符使用:$html = preg_replace('#&lt;h3 class="hdr"&gt;(.*?)&lt;/h3&gt;#si', '', $html);s = 包括换行符,i = 不区分大小写【参考方案2】:

你正在寻找这样的东西......

$output = preg_replace("#<h3 class=\"hdr\">(.*?)</h3>#is", "", $input);

在正则表达式的末尾使用“is”,因为它会导致它不区分大小写,这样更灵活。

【讨论】:

你忘了\它应该是【参考方案3】:

尝试 preg_match,然后在以下模式上尝试 preg_replace:

/(<h3
[\s]+
[^>]*?
class=[\"\'][^\"\']*?hdr[^\"\']*?[\"\']
[^>]*?>
[\s\S\d\D\w\W]*?
<\/h3>)/i

它很混乱,只有当 h3 标记没有内联 javascript 时它才能正常工作,该内联 javascript 可能包含此正则表达式将响应的序列。它远非完美,但在使用 h3 标签的简单情况下它应该可以工作。

虽然没试过,可能需要调整。

如果可能的话,另一种方法是复制该函数,使用您的副本,不使用 h3。

【讨论】:

【参考方案4】:

通过 Google 偶然发现了这一点 - 对于其他任何使用正则表达式解析 HTML 感到肮脏的人,这里有一个 DOMDocument 解决方案,我觉得这样做更安全:

function removeTagByClass(string $html, string $className) 
    $dom = new \DOMDocument();
    $dom->loadHTML($html);
    $finder = new \DOMXPath($dom);

    $nodes = $finder->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' $className ')]");

    foreach ($nodes as $node) 
        $node->parentNode->removeChild($node);
    

    return $dom->saveHTML();

感谢 this other answer 提供 XPath 查询。

【讨论】:

【参考方案5】:

$content = preg_replace('~(.*?)~', '', $content);

上面的代码只有在两个 div 都在同一行时才有效。如果不是呢?

$content = preg_replace('~[^|]*?~', '', $content);

即使中间有换行符也可以使用,但如果不使用 | 则失败符号之间有谁知道更好的方法?

【讨论】:

【参考方案6】:

如果上述解决方案不起作用,这将对某人有所帮助。它删除 iframe 和带有标签“-webkit-overflow-scrolling: touch;”的内容就像我一样:)

RegEx 或正则表达式是您想要删除的代码,PHP 函数 preg_replace() 将删除所有匹配的 div 或 div,或用其他内容替换它们。在下面的示例中,$incoming_data 是您在删除元素之前放置所有内容的位置,而 $result 是最终产品。基本上我们是在告诉代码找到所有带有 class=”myclass” 的 div 并将它们替换为 “”(什么都没有)。

如何在 PHP 中按类删除 div 及其内容 只需将“myclass”更改为您的 div 具有的任何类。

 $result = preg_replace('#<div class="myclass">(.*?)</div>#', ' ',
 $incoming_data);

如何在 PHP 中通过 ID 删除 div 及其内容 只需将“myid”更改为您的 div 具有的任何 ID。

$result = preg_replace('#(.*?)#', ' ', $incoming_data);

如果你的 div 有多个类? 只需将“myid”更改为您的 div 具有的任何 ID,如下所示。

$result = preg_replace('#<div id="myid(.*?)</div>#', ' ', $incoming_data);
or if div don’t have an ID, filter on the first class of the div like this.
$result = preg_replace('#<div class="myclass(.*?)</div>#', ' ', $incoming_data);

如何在 PHP 中删除所有标题 这是删除所有标题的方法。

$result = preg_replace('#<h1>(.*?)</h1>#', ' ', $incoming_data);
and if the heading have a class, do something like this:
$result = preg_replace('#<h1 class="myclass">(.*?)</h1>#', ' ', $incoming_data);

来源:http://www.lets-develop.com/html5-html-css-css3-php-wordpress-jquery-javascript-photoshop-illustrator-flash-tutorial/php-programming/remove-div-by-class-php-remove-div-contents/

【讨论】:

以上是关于PHP - 字符串 - 删除具有特定类的 HTML 标记,包括其内容的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP 提取具有特定类的 div 标签

php 获取具有特定类的表单的ID(重力形式)

PHP - 在php中删除具有特定属性的子项[重复]

在 SimpleXML for PHP 中删除具有特定属性的子项

如何从 php 数组中删除具有特定值的所有元素? (以尽可能最短的方式)[重复]

Php - 如何在 QueryPath 中删除/删除带有特定字符串的标签?