2010-07-17 128 views
0

在我的PHP腳本中,我使用XPATH搜索文本節點。一切都會順利進行 - 除了我用撇號搜索單詞時。php xpath處理撇號/搜索文本中的單引號

基本上我的代碼看起來像這樣

$keyword = $_GET['keyword']; 
...snip... 
$xml = simplexml_load_file($data); 


$search = strtolower($keyword); 
$upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
$lower = "abcdefghijklmnopqrstuvwxyz"; 

$nodes = $xml-xpath("//line[contains(translate(text(),'$upper','$lower'),'$search')]"); 

再次,上述所有代碼的偉大工程 - 我可以搜索內部節點的字符串,我得到了正確的比賽回來。

但是,如果一個節點是這樣的: <line number="23">Shall I compare thee to a summer's day?</line>

,我尋找夏天的一天......我得到上述$nodes線路故障。更重要的是,如果我搜索「...夏天」(不是),上面的行不匹配。獲得上述線路的唯一方法是尋找「......夏天」 - 其中包括夏天。

我試過stripslashes,addslashes,tohellwithslashes,htmlspecialchars但沒有任何工作。此外,根據谷歌,在XPATH 1.0(我被迫使用,因爲這是PHP),我將永遠不能逃脫撇號。真的嗎?

所以我轉向這裏的天才,有人必須必須處理一個XML文件,他們需要用PHP中的XPATH遍歷有一個apostraphe!如果XPATH無法做到這一點,我可以在PHP中做些什麼來讓XPATH返回這個節點?

回答

3

正如Google與您分享的那樣,您無法在XPath中跳過撇號。最簡單的解決方法是在查詢的字符串部分周圍使用不同的引號字符。

$nodes = $xml->xpath('//line[contains(translate(text(),"'.$upper.'","'.$lower.'"),"'.$search.'")]'); 

當然,以上內容僅適用於您不希望在搜索值中允許使用雙引號。如果這可能是必要的,那麼你可以使用Gordon在your previous question中指出的方法將搜索/比較移動到PHP-land。

+0

謝謝(再次)。你的代碼中有一個小小的錯字(如果你希望爲別人的befefit編輯它)是'xml-xpath'應該是'xml-> xpath'(你忘了>)。此外,在我的情況下,我需要改變另一件事,以獲得撇號被識別。從我上面發佈的代碼中,我改變了'$ search = strtolower($ keyword);'到'$ search = stripslashes(strtolower($ keyword));否則進入'夏天'實際上變成'夏天'。希望我這樣做並沒有弄髒別的東西!太感謝了。 – dijon 2010-07-18 16:41:06

0

(這我被迫使用,因爲這是PHP)

也許http://basex.org/api可能是值得一試/嘗試。它允許您使用XQuery/XPath並通過REST或套接字進行通信。除此之外,我推薦salathes解決方案。

+0

這看起來非常酷,我一直在閱讀關於XQuery並希望我可以使用它,但是,在我使用共享主機平臺的情況下,無法安裝這樣的東西。 – dijon 2010-07-18 16:43:06

0

嗯,我在同一個任務中,過了一會兒,我發現在xpath中沒有這方面的支持,安靜的令人失望!但是我們可以隨時解決它!

我想要一些簡單而直率的東西。我帶的是設置你自己的替代品爲撇號,一種唯一的代碼(你不會在你的XML文本中遇到的東西),我選擇了//例如。現在你把你的xml文本和你的xpath查詢。 (在xml的情況下你並沒有總是寫,我們可以用任何編輯器的替換函數來替換)。 現在我們該怎麼辦?我們用這個來正常搜索,檢索結果,並將// //替換爲'。

咆哮,一些樣品我在做什麼:

function repalce_special_char_xpath($str){ 
    $str = str_replace("//apos//","'",$str); 
    /*add all replacement here */ 
    return $str; 
} 

function xml_lang($xml_file,$category,$word,$language){ //path can be relative or absolute 
    $language = str_replace("-","_",$language);// to replace - with _ to be able to use "en-us", ..... 
    $xml = simplexml_load_file($xml_file); 
    $xpath_result = $xml->xpath("${category}/def[en_us = '${word}']/${language}"); 
    $result = $xpath_result[0][0]; 
    return repalce_special_char_xpath($result); 
} 

在XML文件中的文本:

<def> 
     <en_us>If you don//apos//t know which server, Click here for automatic connection</en_us> <fr_fr>Si vous ne savez pas quelle serveur, Cliquez ici pour une connexion automatique</fr_fr> <ar_sa>إذا لا تعرفوا أي سرفير, إضغطوا هنا من أجل إتصال تلقائي</ar_sa> 
    </def> 

,並在PHP文件的調用(生成html):

<span><?php echo xml_lang_body("If you don//apos//t know which server, Click here for automatic connection")?>