2012-04-15 33 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