2012-04-15 64 views
3

我有一个XPath查询,从一个div抓住明文这样xPath - 你可以从节点删除逗号吗?

xpath->query("//div[@id='main']//span[@class='meta']/text()") 

该查询返回​​

反正是有,我可以在我的查询中删除逗号?

感谢

编辑:

用疯狂的代码下面,我的查询现在看起来像这样(我把它换成与字hello的例子中,,,使之少一点混乱。)

$search_term = $xpath->query("translate('//div[@id='main']//span[@class='meta']/text()', 'hello', '')"); 

而且我试图呼应查询结果是这样的:

foreach ($search_term as $st) { 
echo $st->nodeValue; } 

我收到的错误是

Invalid argument supplied for foreach() in ... on line 50 
+0

这是Xpath 1还是2?在XPath 2中有替换正则表达式的'replace()'函数。 – biziclop 2012-04-15 20:40:43

+0

你可以试试看,如果你得到一个大的红色错误信息,你已经得到XPath 1 :) – biziclop 2012-04-15 20:55:13

回答

3

你可以使用translate()空的字符串替换,字符:

xpath->query("translate(//div[@id='main']//span[@class='meta']/text(), ',', '')") 

虽然,它可能会导致尾随空间,如果逗号是在text()节点之前或之后的空间。

然后,您可以使用normalize-space()删除前导/尾随空白:

xpath->query("normalize-space(translate(//div[@id='main']//span[@class='meta']/text(), ',', ''))") 

虽然,它也将空白标准化的序列在文成单个空格的中间。

你也可以使用substring-before()选择前,文字:

xpath->query("substring-before(//div[@id='main']//span[@class='meta']/text(), ' ,')") 

但是,如果字符串不包含,然后substring-before()将不会返回任何东西。

+0

真棒,我会给这个镜头。在这种情况下尾部空间不应该成为问题,但知道如何去除它是很好的。谢谢Mads! – rocky 2012-04-16 06:14:43

+0

Mads,我正在使用你的代码,我相信它正在工作,因为查询本身并没有引发任何错误。但是,当我试图回应我的查询结果(现在应用translate())时,我得到这个错误 - “为foreach()提供的无效参数”。我已更新我的原始帖子,以显示我如何回应查询。 – rocky 2012-04-16 20:35:26

+0

'translate()'和'normalize-space()'函数需要一个字符串作为输入。在XPath 1.0中,如果您为它提供一系列节点,它将选择第一个节点,然后返回一个字符串。您的代码正在等待从您的XPath中选择的节点序列。在XPath 2.0中,你可以这样做'// div [@ id ='main'] // span [@ class ='meta']/text()/ normalize-space()'。在目前情况下,选择节点集并修改for-each中的值(而不是100%XPath)可能是最简单的,除非您可以使用XPath 2.0。 – 2012-04-17 00:15:07

2

貌似rtrim是更好的选择,如果你想删除一个尾随逗号。我不明白为什么涉及XPath会更好,但是您也可以使用fn:replace函数(XPath 2.0)来完成此操作。

+0

Jon,我想如果可能的话,在一个xp查询中处理它会更干净。感谢您的链接。我不知道如何找到我使用的xPath版本,所以我可能只使用rtrim。编辑 - rtrim做了诡计。 – rocky 2012-04-15 20:49:31