【问题标题】:Using PHPQuery to select a URL with a query string使用 PHPQuery 选择带有查询字符串的 URL
【发布时间】:2015-04-11 15:15:36
【问题描述】:

我想根据它是否有一个 URL 属性设置为某个值的子节点来选择一个 XML 节点。

我认为这段代码显示 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 无法正常工作,但您也可能对 :first 应该做什么感到困惑
  • 'first' 的目的是获取匹配的第一个链接(以防有重复)。我更改了链接的顺序以查看 phpQuery 是否在原始解析错误(并且所有链接在内部都相同)或在以后的搜索中失败(似乎是搜索失败)。这不是首先要实现的吗?
  • 在css规范中实际上并不太清楚,但我认为 :first 应该匹配第一个 li,无论它是否匹配。因此,如果第一个 li 不匹配,它可能不应该返回任何内容。有更好的方法来获得第一场比赛。
  • 嗨 - 我做了更多的测试 - 使用重复的 URL, :first 和 :last 按我的预期工作(只是向右)。目前尚不清楚 phpquery 的哪个分支 - 所以认为我必须自己调试它......
  • 我自己测试了一下,我的 phpQuery 没有正确匹配这些选择器。在您的示例中,所有四个link 都是:first:last 以及:only-child,你明白为什么吗?

标签: php phpquery


【解决方案1】:

在 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, "'\"");

它有点(非常)naff,但它适用于我的应用程序!

请注意,键是从“解析”值中提取的,然后该值是字符串的其余部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 2017-05-17
    • 1970-01-01
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 2016-09-25
    相关资源
    最近更新 更多