修剪/删除带有 ID 的 DIV 之后的所有内容

Posted

技术标签:

【中文标题】修剪/删除带有 ID 的 DIV 之后的所有内容【英文标题】:trim/delete Everything after DIV with ID 【发布时间】:2014-09-23 18:15:17 【问题描述】:

在测试环境中,$html 是 20 到 30 行或更多的 HTML 是由对另一个页面/站点的 CURL(抓取)查询创建的,但为了简单起见,我将其简化为这个简单的示例:

我需要回显 ID 为“keepthis”的 DIV 及其所有 HTML 结构完整的内容,但删除它之前和之后的所有内容。 ID 为“deletethis”的 DIV 将始终具有该 ID。我查看了涉及 substr/explode/trim 的多个帖子,但我找不到或无法使用从

的位置 0 开始删除 $html 中的所有内容的方法

那个 div(deletethis) 不在代码中的固定字符数处,我可以在 DIV(keepthis) 工作之前删除所有内容,而不是另一边。任何帮助将不胜感激。

$html = '<h1>hello world</h1><div id="keepthis"> Sample content</div><div id="deletethis">a bunch of other dynamic html here</div>';
$x = substr($html, strpos($html, '<div id="keepthis">')); //cleans up the BEFORE code
echo $x;

【问题讨论】:

为什么不将代码解析成 DOM 文档呢?到目前为止,您尝试过哪些正则表达式模式?他们是怎么失败的? 使用 DOMDocument 和 DOMXpath 你当然可以做到这一点...hint @DMS 你的意思是regex101.com/r/jM2lE0/2 ? @AvinashRaj Regex 不应用于解析 HTML... @War10ck 对于较短的 html 代码来说这不会是一个大问题。 【参考方案1】:

所以根据链接试试这个:

$html = '<h1>hello world</h1><div id="keepthis"> Sample content</div><div id="deletethis">a bunch of other dynamic html here</div>';
$dom = new DOMDocument();
$dom->loadHTML($html);
$xpath = new DOMXpath($dom);
$result = $xpath->query('//div[@id="keepthis"]');
if ($result->length > 0) 
    var_dump($result->item(0)->nodeValue);

警告:节点值不会输出标签,但您可以遍历 $result->item(0) 的子节点来获取它们

【讨论】:

谢谢,让我试着提供一个更好的例子:link $x=""; $url = "http://www.trane.com/residential/en/products/heating-and-cooling/air-conditioners.html"; $curl = curl_init($url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); $output = curl_exec($curl); curl_close($curl); $DOM = new DOMDocument; libxml_use_internal_errors(true); $DOM-&gt;validateOnParse = true; @$DOM-&gt;loadHTML($output); libxml_use_internal_errors(false); $DOM-&gt;normalizeDocument(); $html = $DOM-&gt;saveHTML(); $x = substr($html, strpos($html, '&lt;div id="modelsListContent"&gt;')); $x = str_replace('&lt;img src="/','&lt;img src="http://trane.com/',$x); echo $x;【参考方案2】:
string rtrim ( string $str [, string $character_mask ] )

这个函数返回一个字符串,从 str 的末尾去掉空格。

没有第二个参数,rtrim() 会去掉这些字符:

【讨论】:

我不确定rtrim() 将如何提供帮助。该函数对字符和 not 字符串进行操作。所以rtrim($str, '&lt;html&gt;'); 不会像你想的那样做。

以上是关于修剪/删除带有 ID 的 DIV 之后的所有内容的主要内容,如果未能解决你的问题,请参考以下文章

带有CSS内容的div,伪元素后不可见

共享一个ID,删除本地通讯录后,另一台会自动删除吗?

JQuery 删除子元素

用js给一个div中添加一个带有class的div ?

在不重新加载的情况下向 div 添加/删除内容

删除边框时,文本字段的内容被修剪