理解php中的parse_str

时间:2011-09-30 09:53:36

标签: php parsing query-string

我是一个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”值,我原本认为这是我唯一需要的值,但显然不是。它甚至不在示例网址中,虽然我知道它在很多其他网址中。

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

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

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

    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 '';
        }
    }
    

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

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

    但是,如果我删除此方法中的所有内容,除了返回'';然后它工作正常 - 当然,查询应该在网格中的字段是空的,但所有其他字段都具有应有的所有信息。所以这只是一个考验。但是,应该只能返回空字符串的代码怎么可能不起作用,而只返回空字符串而不执行其他任何操作的代码也可以工作?我很困惑......

2 个答案:

答案 0 :(得分:1)

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

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

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

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

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

答案 1 :(得分:0)

原来问题出在瑞典字符上 - 如果我在返回它之前对值使用了utf8_encode()它就可以了。如果有人知道更好的方法,我会很高兴听到它,否则这至少对我有用。