php xpath处理搜索文本中的撇号/单引号

时间:2010-07-17 20:27:14

标签: php xpath escaping

在我的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行收到错误。更重要的是,如果我搜索“...夏天”(没有),则上述行不匹配。让上述线路返回的唯一方法是搜索“......夏天” - 其中包括夏季。

我尝试过striplashes,addslashes,tohellwithslashes,htmlspecialchars但没有任何效果。另外,根据谷歌的说法,在XPATH 1.0中(由于这是PHP,我不得不使用),我永远无法逃脱撇号。严重?

所以我转向这里的天才,有人必须处理一个XML文件,他们需要在PHP中使用XPATH进行遍历的传记!如果XPATH不能这样做,我可以在PHP中做什么来让XPATH返回这个节点?

3 个答案:

答案 0 :(得分:3)

Google与您分享,您无法逃脱XPath中的撇号。最简单的解决方法是在查询的字符串部分周围使用不同的引号字符。

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

当然,只有在您不希望在搜索值中使用双引号时,上述内容才有用。如果这可能是必要的,那么你可以使用Gordon在your previous question中指出的方法将搜索/比较移动到PHP-land。

答案 1 :(得分:0)

  

(由于这是PHP,我被迫使用)

或许http://basex.org/api可能值得一试/尝试。它允许您使用XQuery / XPath并通过REST或套接字进行通信。除此之外,我建议使用salathes解决方案。

答案 2 :(得分:0)

嗯,我在同一个任务中,过了一会儿,我发现xpath没有支持这个,安静令人失望!但我们总能解决它!

我想要一些简单而直接的东西。我带来的是设置自己的替换撇号,一种独特的代码(你在xml文本中不会遇到的东西),我选择了//'// 例如。现在你将它放在xml文本和xpath查询中。 (如果你没有写xml,我们可以用任何编辑器的replace函数替换)。 现在我们怎么办?我们正常搜索,检索结果,然后将//'//替换为'。

低估了我正在做的一些样本:

  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")?>