在我的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返回这个节点?
答案 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")?>