PHP DOM解析<;之间的文本;人力资源>;标签
我试图通过PHP使用DOM解析一些HTML来获取两个PHP DOM解析<;之间的文本;人力资源>;标签,php,dom,domdocument,Php,Dom,Domdocument,我试图通过PHP使用DOM解析一些HTML来获取两个标记之间的文本,但在将hr传递到getElementsByTagName中时,我没有得到任何输出: <?php $dom = new DOMDocument(); $dom->loadHTML("<hr>Text<hr>"); $hr = $dom->getElementsByTagName("hr"); for ($i=0; $i<$hr->length;
标记之间的文本,但在将hr
传递到getElementsByTagName
中时,我没有得到任何输出:
<?php
$dom = new DOMDocument();
$dom->loadHTML("<hr>Text<hr>");
$hr = $dom->getElementsByTagName("hr");
for ($i=0; $i<$hr->length; $i++) {
echo "[". $i . "]" . $hr->item($i)->nodeValue . "</br>";
}
?>
(为什么是四行结果?)
我在运行PHP版本7.1.3的Web服务器上运行此代码。我不能使用诸如file\u get\u html
或str\u get\u html
之类的函数,因为它返回了一个有关未定义函数调用的错误
为什么
hr
标记不产生结果?这种情况会发生,因为
没有子节点(文本也是子节点)。
要获取
节点之间的文本,必须迭代同一级别上的所有节点,并检查当前节点是否为文本节点(nodeType==3),上一个同级节点必须是hr
节点,下一个同级节点也必须是hr
节点
<?php
$dom = new DOMDocument();
$dom->loadHTML("<hr>Text<hr>");
foreach ($dom->childNodes as $childNode) {
if (3 !== $childNode->nodeType) {
continue;
}
if (!$childNode->previousSibling || ('HR' !== $childNode->previousSibling->nodeName)) {
continue;
}
if (!$childNode->nextSibling || ('HR' !== $childNode->nextSibling->nodeName)) {
continue;
}
echo "{$childNode->nodeValue}\n";
}
也许您要查找的是两个
元素之间的文本节点的内容?在这种情况下,我们将查找具有XPath表达式的同级:
<?php
$dom = new DOMDocument();
$dom->loadHTML("Some text<hr>The text<hr>Other text");
$xp = new DomXPath($dom);
$result = $xp->query("//text()[(preceding-sibling::hr and following-sibling::hr)]");
foreach ($result as $i=>$node) {
echo "[$i]$node->textContent<br/>\n";
}
您有两个空的
元素。他们怎么会有一个nodeValue
?忘了提到,如果add,它会给我一个错误,我仍然没有得到值:DOMDocument::loadHTML():实体中意外的结束标记:hr,第1行。那么,正则表达式是获取标记之间的值的唯一方法吗?这种情况会发生,因为
不能包含任何内容:
<?php
$dom = new DOMDocument();
$dom->loadHTML("Some text<hr>The text<hr>Other text");
$xp = new DomXPath($dom);
$result = $xp->query("//text()[(preceding-sibling::hr and following-sibling::hr)]");
foreach ($result as $i=>$node) {
echo "[$i]$node->textContent<br/>\n";
}