Я хочу выбрать узел XML в зависимости от того, есть ли у него дочерний элемент с атрибутом URL, установленным на определенное значение.
Я думаю, что этот код показывает, что phpQuery неправильно анализирует URL … но я, возможно, что-то упустил из-за экранирования = …
Есть идеи?
<?php
include '../libs/phpQuery.php';
phpQuery::newDocumentXML('
<doc><item>item 1<link url="http://example.com" /></item>
<item>item 2<link url="http://example.com?abc" /></item>
<item>item 3<link url="http://example.com?abc=" /></item>
<item>item 4<link url="http://example.com?abc=21" /></item>
</doc>');
echo "<pre>
".
pq("link[url='http://example.com']:first")->parents('item')->xml()
."".
pq("link[url='http://example.com?abc']:first")->parents('item')->xml()
."".
pq("link[url='http://example.com?abc=']:first")->parents('item')->xml()
."".
pq("link[url='http://example.com?abc=21']:first")->parents('item')->xml()
."</pre>";
?>
Это возвращается
<pre>
item 1<link url="http://example.com"/>
item 2<link url="http://example.com?abc"/>
item 2<link url="http://example.com?abc"/>
item 2<link url="http://example.com?abc"/>
</pre>
В phpQuery / phpQueryObject.html вокруг строки 749
Атрибут и его обязательное значение анализируются с помощью
$value = null;
list($attr, $value) = explode('=', $attr);
$value = trim($value, "'\"");
Таким образом, второе ‘=’ и все, что после, потеряно (взорвано в третье значение, которое не зафиксировано). Я изменил это на
// attr with specifed value
if (mb_strpos($s, '=')) {
$value = null;
$raw = $attr;
parse_str($raw,$ary);
$attr = current(array_keys($ary));
$value = substr($raw,strlen($attr)+1);
$value = trim($value, "'\"");
Это немного (очень) ворс, но это работает для моего приложения!
Обратите внимание, что ключ извлекается из значения ‘parse’, затем это остаток строки.
Других решений пока нет …