Php 在xpath中排除基于类和样式的标记

Php 在xpath中排除基于类和样式的标记,php,xml,regex,parsing,xpath,Php,Xml,Regex,Parsing,Xpath,我有以下用于xpath查询的代码 <div class="buying"> <h1 class="parseasinTitle "> <span id="btAsinTitle">Top Ten Tips for Growing Your Own Tomatoes (The Basic Art of Italian Cooking) <span style="text-transform: capitalize; font-size: 16px;"

我有以下用于xpath查询的代码

<div class="buying">


<h1 class="parseasinTitle ">

<span id="btAsinTitle">Top Ten Tips for Growing Your Own Tomatoes (The Basic Art of Italian Cooking) <span style="text-transform: capitalize; font-size: 16px;">[Kindle Edition]</span></span>


</h1>
</div>
但结果是

种植西红柿的十大秘诀(意大利烹饪的基本艺术)[Kindle版]

我想,我必须排除
,才能达到我的目的, 我怎么做

使用以下XPath:

//span[@id="btAsinTitle"]/text()

XPath只返回id为的节点,但由于DOM是链接的DOMNodes树,因此返回的节点将包含子节点。当您使用
nodeValue
textContent
访问返回的span时,PHP将返回所有子节点的组合DOMText节点,包括持有“Kindle Edition”的子span

更多信息请访问

如果只想获取第一个文本部分,则必须获取第一个子节点的nodeValue:

echo $result->item(0)->childNodes->item(0)->nodeValue;
直接使用XPath获取该字符串的另一种方法是

echo $xpath->evaluate('string(//span[@id="btAsinTitle"]/text())');

如果要返回整个DOMText节点,请使用

//span[@id=“btAsinTitle”]/text()

我知道的是,text()函数用于从节点提取文本,但我在这里感到困惑,为什么它在我的例子中起作用?[kindle添加]也是一个文本吗?为什么会这样?我猜原因是,[kindle edition]包含在另一个“”中,因此它被删除,xpath所选span周围的文本被提取,对吗?@NewBee,此查询使用
text()
函数选择
span[@id=“btAsinTitle”]
子文本节点。此范围仅包含1个子节点-
种植西红柿的十大技巧(意大利烹饪的基本艺术)
。文本节点
[Kindle Edition]
是另一个
的子文本节点span
。谢谢@Gordon,你刚才回答的只是我刚才问自己的问题。。
echo $result->item(0)->childNodes->item(0)->nodeValue;
echo $xpath->evaluate('string(//span[@id="btAsinTitle"]/text())');