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

时间:2010-06-30 13:28:47

标签: php html class string

我有一个这样的字符串:

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

  </div>
</div>

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

6 个答案:

答案 0 :(得分:17)

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

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

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

答案 1 :(得分:3)

这样的东西就是你要找的......

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

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

答案 2 :(得分:1)

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

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

它很乱,只有当h3标签没有内联javascript时才能正常工作,这可能包含这个正则表达式会对其做出反应的序列。它远非完美,但在使用h3标签的简单情况下,它应该可以工作。

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

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

答案 3 :(得分:0)

  

$ content = preg_replace('〜(。*?)〜','',$ content);

以上代码仅在div有两个都在同一行时才有效。怎么样呢?

  

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

即使两者之间存在换行符,也能正常工作,但如果不这样使用则失败符号是介于谁之间知道更好的方式?

答案 4 :(得分:0)

  

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

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/

答案 5 :(得分:0)

通过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查询。