【问题标题】:Understanding 'parse_str' in PHP了解 PHP 中的“parse_str”
【发布时间】:2011-09-30 09:53:35
【问题描述】:

我是一个 PHP 新手,试图找到一种方法来使用 parse_str 从数据库中解析多个 URL(注意:不是来自请求,它们已经存储在数据库中,不要问...所以 _GET 不起作用)

所以我正在尝试这个:

    $parts = parse_url('http://www.jobrapido.se/?w=teknikinformat%C3%B6r&l=malm%C3%B6&r=auto');
    parse_str($parts['query'], $query);
    return $query['w'];

请注意,这里我只是提供一个示例 URL,在实际应用程序中,该 URL 将作为来自数据库的参数传入。如果我这样做,它工作正常。但是,我不明白如何正确使用此功能,以及如何避免错误。

首先,这里我使用“w”作为返回的索引,因为我可以清楚地看到它在查询中。但是这些东西是如何工作的呢?是否有一组特定值可以用来获取整个查询字符串?我的意思是,如果我进一步看,我也可以在这里看到“l”和“r”......

当然,我也可以提取这些值并将结果连接起来,但是这些值名称是任意的,还是有办法准确知道要提取哪些值?当然还有“q”值,我最初认为这是我唯一需要的值,但显然不是。它甚至不在示例 URL 中,尽管我知道它在许多其他 URL 中。

那么我该怎么做呢?这就是我想要的:

  1. 提取查询字符串的所有部分,为我提供 URL 的搜索字符串部分的可读输出(因此在上面它将是“teknikinformatör Malmö auto”。请注意,我需要将 URL 编码转换为瑞典语字符,有什么简单的方法可以在 PHP 中做到这一点?)
  2. 处理错误,以便如果上述方法由于某种原因不起作用,该方法应该只返回一个空字符串,从而不会破坏代码。因为在这一点上,如果我使用上面的实际参数 $url,而不是示例 URL,我会得到错误,因为许多 URL 没有“ w" 参数,有的可能是数据库中的空字段,有的可能是格式错误等。那么如何稳定地处理这些错误,如果解析成功则返回一个值,否则返回空字符串?

似乎发生了一个非常奇怪的问题,我在调试过程中看不到。我把这个测试代码放进去只是为了看看发生了什么:

function getQuery($url)
{
    try
    {
        $parts = parse_url($url);
        parse_str($parts['query'], $query);
        if (isset($query['q'])) {
            /* return $query['q']; */
            return '';
        }
    } catch (Exception $e) {
        return '';
    }
}

现在,显然在实际代码中,我希望返回注释掉的部分。然而,令人费解的是:

据我所知,使用这段代码,每条路径都应该返回一个空字符串。但这不起作用 - 它在结果页面中给了我一个完全空的网格。在调试过程中没有错误或任何东西,当我在调试过程中单步执行对象时,它们看起来很好。

但是,如果我从这个方法中删除所有内容,除了 return '';然后它工作正常 - 当然,查询应该是网格中的字段是空的,但所有其他字段都具有应有的所有信息。所以这只是一个测试。但是,应该只能返回一个空字符串的代码怎么可能不起作用,而只返回一个空字符串并且什么都不做的代码却可以工作呢?我彻底糊涂了……

【问题讨论】:

    标签: php parsing query-string


    【解决方案1】:

    查询参数的含义完全取决于处理 URL 的应用程序,因此没有“正确”参数 - 它可能是 wqsearchquery。您可以启发式地搜索最常见的变量 (=guess),或返回所有参数的数组。这取决于您要达到的目标。

    parse_str 已经解码了 urlencoding。请注意,urlencoding 是一种编码字节的方法,而不是字符。这取决于应用程序期望的编码。通常(在这个示例查询中),处处都应该是 UTF-8,所以你应该被 1 覆盖。

    测试该值是否存在,如果不存在则返回空字符串,如下:

    $heuristicFields = array('q', 'w', 'searchquery');
    foreach ($heuristicFields as $hf) {
      if (isset($query[$hf])) return $query[$hf];
    }
    return '';
    

    如果输入有效,该函数返回null,并在 URL 明显无效时遇到错误(即显示警告消息)。 try...catch 块无效。

    【讨论】:

    • 好的,谢谢你的解释,我会试试你的例子。但是,我对“猜测”参数可能是什么感觉不太好......那么你的另一个建议呢,我可以返回所有参数的数组?我尝试了一个测试,通过返回数组中的第一个:$query [0],但这引发了一个错误,可能是因为格式错误的 url 和空字段以及所有这些,我猜......所以如果我做 parse_str它失败了,我该如何检查,然后只是连接你提到的数组而不是猜测参数可能是什么?
    • @AndersSvensson 正如我所写,这首先取决于您想要做什么。是否要查找搜索查询?或者是其他东西。哦,虽然您可以对参数名称做出有根据的猜测,但您应该猜测错误的原因,并且仅仅因为您的代码错误而忽略替代方案。获取查询数组中第一个元素的正确方法是reset($query);,因为它的索引不是数字的。 parse_str 永远不会失败,它只是可能返回一个空数组。你可以检查count($query) == 0然后返回0。
    • 好的,谢谢,但是 parse_url 可能会失败吗?因为只要我传入真实的 url(包括格式错误的和空字符串),整个函数就会失败,我会在结果页面中得到一个空网格。如果只是这个函数返回了一个空字符串,我只会将该字段设为空,而不是整个网格......那么在将 parse_url 传递给 parse_str 之前如何检查它是否失败?
    • @AndersSvensson parse_url 可能会失败,然后返回 false(检查结果如下:if ($parts === false) return '';。但是,只有当 URL 明显无效时才会发生这种情况(例如,空字符串)。更有可能的是,您的实现中存在错误。请随时就完整代码和至少一个失败的测试用例提出另一个问题,并在此处通知我。跨度>
    • 把所有的代码都贴出来可能真的很难,会涉及很多。但我会尝试用似乎是什么问题来编辑问题......
    【解决方案2】:

    原来问题出在瑞典字符上 - 如果我在返回值之前使用 utf8_encode() ,它工作正常。

    【讨论】:

      猜你喜欢
      • 2019-11-11
      • 2015-09-28
      • 2011-03-08
      • 2012-01-01
      • 2019-05-16
      • 1970-01-01
      • 2018-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多