Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP DOM解析<;之间的文本;人力资源>;标签_Php_Dom_Domdocument - Fatal编程技术网

PHP DOM解析<;之间的文本;人力资源>;标签

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;

我试图通过PHP使用DOM解析一些HTML来获取两个

标记之间的文本,但在将
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";
}