PHP Simple HTML Dom:获取childNodes nodeValue?
Posted
技术标签:
【中文标题】PHP Simple HTML Dom:获取childNodes nodeValue?【英文标题】:PHP Simple HTML Dom: Get childNodes nodeValue? 【发布时间】:2013-01-25 05:04:06 【问题描述】:a.php:
<ul id="ul1">
<li id="pt1">Point 1
<ul id="ul2">
<li id="pt11">Point 1.1</li>
<li id="pt12">Point 1.2</li>
<pre class="CodeDisplay">
some codes
</pre>
<li id="ref">Reference: <a href="link.html" target="_blank">link</a></li>
</ul>
</li>
</ul>
我只想获取 nodeValue“Point 1”。在 JS 中是:
alert(document.getElementsByTagName("li")[0].childNodes[0].nodeValue);
但我想在 PHP (Simple HTML Dom) 中获取 nodeValue;这是另一个 PHP 页面 (b.php) 中的代码 sn-p:
<?php
include('simple_html_dom.php');
$html = file_get_html('http://lifelearning.net63.net/a.php');
// stuck here:
echo $html->getElementsByTagName('ul',0)->getElementsByTagName('li',0)->nodeValue;
//
?>
我使用了 textContent 但它只是提取第 1 点下的内容后代。这不是我想要的。我只想要“第 1 点”。 任何帮助表示赞赏!
【问题讨论】:
【参考方案1】:试试这个:
<?php
include('simple_html_dom.php');
$html = file_get_html('http://lifelearning.net63.net/a.php');
echo $html->find('li[id=pt1] li', 0)->innertext;
上面的 sn-p 找到第一个(下降到 li#pt1
)匹配 li
标记并给出你的内部文本(文本之间的内容,包括其中的所有 HTML,如果有的话)。
看看SimpleHTMLDom docs。您可以通过多种方式和示例从 HTML 输出中找到内容(ID、类等)。 SimpleHTMLDom 主要遵循 jQuery/CSS 选择器。
注意,如果你不使用innertext
方法,它会返回一个SimpleHTMLDom节点,你需要在显示之前处理这个节点。
如果没有匹配的元素,它将返回E_WARNING
错误消息。因此,请确保您的输入包含需要的元素或确保该元素带有 isset()
【讨论】:
感谢您的回复。但它实际上返回的是“Point 1.1”而不是“Point 1”。【参考方案2】:在网上其他人的帮助下,建议一个更简单的解决方案:
$html = new DOMDocument();
$html->loadHTMLFile('http://lifelearning.net63.net/a.php');
echo $html->getElementsByTagName('li')->item(0)->childNodes->item(0)->textContent; // returns "Point 1"
我学到的是
首先,在我的例子中,不需要任何外部库,DOMDocument 负责获取网页的 HTML DOM。
其次,使用 item() 和 childNodes。非常像 JS 中的内容:
document.getElementsByTagName("li")[0].childNodes[0].nodeValue
但感谢您的所有回复。
【讨论】:
坦率地说,您应该接受自己的答案,因为不推荐使用该正则表达式解决方案。【参考方案3】:你可能会找这个
<?php $str2 = ' <ul id="ul1"> ' ;?>
<?php $str2 .= '<li id="pt1"><div>Point 1</div> ' ;?>
<?php $str2 .= ' <ul id="ul2"> ' ; ?>
<?php $str2 .= ' <li id="pt11">Point 1.1</li>' ; ?>
<?php $str2 .= ' <li id="pt12">Point 1.2</li>' ; ?>
<?php $str2 .= ' <pre class="CodeDisplay">' ; ?>
<?php $str2 .= ' some codes' ; ?>
<?php $str2 .= ' </pre>' ; ?>
<?php $str2 .= ' <li id="ref">Reference: <a href="link.html" target="_blank">link</a></li>' ; ?>
<?php $str2 .= ' </ul>' ; ?>
<?php $str2 .= ' </li> ' ; ?>
<?php $str2 .= ' </ul>' ; ?>
<?php
function getTextBetweenTags($string, $tagname)
$pattern = "/<$tagname ?.*>(.*)<\/$tagname>/";
preg_match($pattern, $string, $matches);
return $matches[1];
$txt = getTextBetweenTags($str2, "div");
echo $txt;
?>
will output : --> Point 1
【讨论】:
OP 已经在使用 SimpleHTMLDom。 [在此处插入“解析 HTML 的正则表达式不好”评论] 这是容易出错的建议。正则表达式不支持 DOM。以上是关于PHP Simple HTML Dom:获取childNodes nodeValue?的主要内容,如果未能解决你的问题,请参考以下文章
PHP Simple HTML Dom:获取childNodes nodeValue?
PHP Simple HTML DOM Parser 如何使用 find 方法获取第三个表
使用 PHP 和 Simple HTML DOM 解析 HTML 时遇到问题
从 Simple Html Dom 中排除不需要的 html - PHP