如何使用正则表达式删除HTML元素及其内容

6
我有一个带有div id的输出,需要将其删除,如下所示:
<div id="ithis" class="cthis">Content here which includes other elements etc..) </div>

我该如何使用PHP和正则表达式删除此div及其内部所有内容?
谢谢。

你能进一步阐述吗?这是以字符串的形式吗? - Ian Elliott
1
你知道id名称和/或类名吗?或者有没有id和/或类的明显标识符,以便您不会删除所有属于该描述的div?还是您想删除所有div及其内容? - Justin Giboney
3个回答

13

简单的答案是你不需要这样做。相反,你可以使用PHP的许多HTML解析器之一。正则表达式是操作HTML的一种不可靠且容易出错的方式。

话虽如此,你可以这样做:

$html = preg_replace('!<div\s+id="ithis"\s+class="cthis">.*?</div>!is', '', $html);

但是很多事情都可能出错。比如,如果其中包含一个 div:

<div id="ithis" class="cthis">Content here which <div>includes</div> other elements etc..) </div>

你最终会得到:

 other elements etc..) </div>

由于正则表达式将停留在第一个</div>上。并且没有什么方法可以通过正则表达式来始终解决这个问题。

使用解析器完成后,它看起来更像这样:

$doc = new DOMDocument();
$doc->loadHTML($html);
$element = $doc->getElementById('ithis');
$element->parentNode->removeChild($element);
$html = $doc->saveHTML();

值得注意的是,(A)如果元素不存在,则$elementNULL,并且->removeChild()命令将失败并出现致命错误;(B)您可以/可能希望使用@来使->loadHTML()静音有关格式不正确的HTML的任何通知:@$doc->loadHTML($html); - random_user_name

1

我不了解PHP,但您可以将/<id.*?<\/id[^>]*>/替换为空。


0

PHP是服务器端的,输出来自服务器。你不能只是不输出它吗?或者你是想隐藏它?如果是这样,在样式表中,只需说#ithis {display:none}

如果字符串是从PHP中的某个函数返回的,而你又不想干扰那段代码,你必须编写一个非常困难的正则表达式来处理嵌套的div、输出中的不同语法等问题。我建议使用一些解析器(也许是这个Zend Framework component)来帮助你。我曾经用过它几次来处理类似的问题。虽然如果你完全不熟悉ZF,你可能想尝试其他东西。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接