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, addlashes, tohellwithslashes, htmlspecialchars, но ничего не работает. Кроме того, согласно Google, в XPATH 1.0 (который я вынужден использовать, поскольку это PHP), я НИКОГДА не сможет избежать апострофа. Шутки в сторону?

Поэтому я обращаюсь к гениям здесь, кто-то ДОЛЖЕН иметь дело с XML-файлом, который им нужно было пройти с XPATH на PHP, у которого был апострап! Если XPATH не может этого сделать, что я могу сделать в PHP, чтобы заставить XPATH вернуть этот узел?

Поскольку Google поделился с вами, вы не можете избежать апострофа в XPath. Простейшим обходным путем является использование другого символа кавычки вокруг строковых частей запроса.

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

Конечно, вышесказанное полезно только в том случае, если вы не хотите разрешать двойные кавычки в значении поиска. Если это может быть необходимо, вы можете перенести поиск / сравнение на PHP-землю, используя метод, который указал Гордон в вашем предыдущем вопросе .

(который я вынужден использовать, поскольку это PHP)

возможно, http://basex.org/api может стоить посмотреть / попробовать. Он позволяет использовать XQuery / XPath и связывается через REST или сокеты. Кроме того, я бы рекомендовал решения для салатов.

Ну, я был в одном и том же квесте, и через мгновение я обнаружил, что для этого нет поддержки в xpath, тихое разочарование! Но мы всегда можем обойти это!

Мне нужно было что-то простое и прямое. Я пришел, чтобы установить вашу собственную замену для апострофа , своего рода уникальный код (что-то, с чем вы не столкнетесь в своем XML-тексте), я выбрал // apos // например. теперь вы помещаете это как в свой XML-текст, так и в свой запрос xpath . (в случае xml вы не писали всегда, мы можем заменить функцию замены любого редактора). А теперь, как мы это делаем? мы обычно обыскаем это, извлекаем результат и заменяем // // apos // на '.

некоторые примеры из того, что я делал:

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