Запрос Xpath, извлеченный из MySQL, не работает - PullRequest
0 голосов
/ 16 марта 2011

Я пытаюсь превратить длинный список тестов запросов xpath в гораздо более сжатую функцию, и у меня возникают проблемы с запуском запросов xpath после получения из mysql.

Это сводит меня с ума, может кто-нибудь объяснить, где я иду не так, пожалуйста?

Пример таблицы MySQL:

CREATE TABLE `spidey_regex` (
  `id` int(12) NOT NULL auto_increment,
  `regexp` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM;
INSERT INTO `spidey_regex` (`id`, `regexp`) VALUES (1, '''//div[starts-with(@id, "stuff")]''');

Пример PHP-кода с использованием xpath:

<?php
   $html = '<div id="stuff123"><a href="link1.html">Link 1</a><a href="#link">Link 2</a><a href="link2.html">Link 3</a></div>';
   $cnt=0;
       $dom = new DOMDocument();
       @$dom->loadHTML($html);
       $dom->preserveWhiteSpace = false;
       $xpath = new DOMXPath($dom); 
     $myresult = mysql_query("select * from spidey_regex",$db);
   while($myrow = mysql_fetch_array($myresult)){
     $regexp = stripslashes(trim($myrow[regexp]));
     $result = $xpath->query($regexp);  // use xpath with query from MySQL
     foreach($result as $e){ $cnt++; }
       if($cnt == '0'){ 
         continue; 
       } 
       else { 
         echo "1. Got here!!"; 
       }
   }
?>

1 Ответ

0 голосов
/ 16 марта 2011
INSERT INTO `spidey_regex` (`id`, `regexp`) VALUES (1, '''//div[starts-with(@id, "stuff")]''');

Двойная кавычка - немного странная вещь.Если бы мы использовали обычные обратные слэши, вместо этого мы увидели бы:

'\'//div[starts-with(@id, "stuff")]\''

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


Доказательство в подсказке PHP Interactive:

php > $html = '<div id="stuff123"><a href="link1.html">Link 1</a><a href="#link">Link 2</a><a href="link2.html">Link 3</a></div>';
php > $dom = new DOMDocument();
php > $dom->loadHTML($html);
php > $xpath = new DOMXPath($dom);
php > $regexp = '//div[starts-with(@id, "stuff")]';
php > $result = $xpath->query($regexp);
php > echo $result->length;
1
php > $regexp = "'{$regexp}'";
php > $result = $xpath->query($regexp);
php > echo $result->length;
0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...