Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.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:“您必须遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他有关法律法规。”;不能';我拿不到糖果。“中不再存在节点”;使用DOMXpath_Php_Domxpath - Fatal编程技术网

PHP:“您必须遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他有关法律法规。”;不能';我拿不到糖果。“中不再存在节点”;使用DOMXpath

PHP:“您必须遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他有关法律法规。”;不能';我拿不到糖果。“中不再存在节点”;使用DOMXpath,php,domxpath,Php,Domxpath,我有一些HTML包含以下内容: 外面的 内部1 内部2 我正在对这些元素的内容执行str\u replace(): $dom=newdomdocument(); $dom->loadHTML($html); $xpath=newdomxpath($dom); foreach($xpath->query(//div[@class='test'])作为$node){ $node->nodeValue=str_replace(“,”X“,$node->nodeValue); } 这将用“X”替换

我有一些HTML包含以下内容:


外面的
内部1
内部2
我正在对这些元素的内容执行
str\u replace()

$dom=newdomdocument();
$dom->loadHTML($html);
$xpath=newdomxpath($dom);
foreach($xpath->query(//div[@class='test'])作为$node){
$node->nodeValue=str_replace(“,”X“,$node->nodeValue);
}
这将用“X”替换任何空格

但这会导致以下错误:

警告:无法获取DomeElement。第63行的/path/to/my/file.php中不再存在节点

如果只有一个嵌套的div,则它可以工作:


外面的
内部1
为什么会发生这种情况,我如何才能让它工作?

尝试更改

foreach($xpath->query("//div[@class='test']") as $node) 

按评论编辑:

假设外部元素中有一个空间(即它的“外部1:):

loadHTML($string);
$xpath=newdomxpath($dom);
foreach($xpath->query('//div[@class=“test”]//text()')作为$node){
$nnode=trim($node->nodeValue);
echo$nnode=str_replace(“,”X“,$nnode);
}

您试图替换哪些空格?作为调试的一部分,将
echo$node->nodeValue.PHP_EOL;
添加到循环中,以检查它使用的是什么文本。我认为问题在于您只需要查询元素一次,然后循环对象。目前您正在反复执行相同的查询。
$elements=$x路径->查询(“//div[@class='test']”
foreach($node形式的元素){…}@NigelRen它首先输出“外部-内部1-内部2”,然后输出“内部1”,然后发生错误。然后输出”“错误再次发生。@EternalHour谢谢,但这没有任何区别。谢谢-这确实成功地处理了内部n个元素,但它跳过了外部元素(在现实世界中,外部元素可能也有一个空格;我应该在我的示例中澄清这一点)@PhilGyford-事实上,它确实跳过了外部元素-而且是故意的,正如最初的问题。那么,你是说外部元素可能也有一个空格,你想用一个X来代替它吗?是的,对不起,当我说“我正在对这些元素的内容做
stru replace()
”我应该更明确,并提供一个更好的例子——我指的是所有的元素,而不仅仅是内部的两个。这很好,谢谢@JackFleeting!奇怪的是,
foreach
循环在每个内部元素之后都有一个额外的迭代。它们很容易被忽略,因为它们最终都是空字符串,但是你能解释一下y?@PhilGyford-它是xpath的工件之一;如果您尝试
count(//div[@class=“test”]//text())
,您将看到如果返回的是
5
,而不是直觉上预期的
3
。每对结束
与其紧接的开始
之间的空格计为1。这两对中有两个,因此额外的迭代。。。
foreach($xpath->query('//div[@class="test"]//div[@class="test"]') as $node)
<?php
$string = <<<XML
<div class="test">
  Outer 1
  <div class="test">Inner 1</div>
  <div class="test">Inner 2</div>
</div>
XML;
$dom = new DOMDocument();
$dom->loadHTML($string);
$xpath = new DOMXpath($dom);

foreach($xpath->query('//div[@class="test"]//text()') as $node) {
   $nnode = trim($node->nodeValue);

   echo $nnode  = str_replace(" ", "X", $nnode);
}