2010-07-17 125 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")?>