修剪/删除带有 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->validateOnParse = true; @$DOM->loadHTML($output); libxml_use_internal_errors(false); $DOM->normalizeDocument(); $html = $DOM->saveHTML(); $x = substr($html, strpos($html, '<div id="modelsListContent">')); $x = str_replace('<img src="/','<img src="http://trane.com/',$x); echo $x;
【参考方案2】:
string rtrim ( string $str [, string $character_mask ] )
这个函数返回一个字符串,从 str 的末尾去掉空格。
没有第二个参数,rtrim() 会去掉这些字符:
【讨论】:
我不确定rtrim()
将如何提供帮助。该函数对字符和 not 字符串进行操作。所以rtrim($str, '<html>');
不会像你想的那样做。以上是关于修剪/删除带有 ID 的 DIV 之后的所有内容的主要内容,如果未能解决你的问题,请参考以下文章