我是一个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”值,我原本认为这是我唯一需要的值,但显然不是。它甚至不在示例网址中,虽然我知道它在很多其他网址中。
那我该怎么做呢这就是我想要的:
编辑:
似乎有一个非常奇怪的问题,我在调试过程中看不到。我把这个测试代码放进去看看发生了什么:
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 '';
}
}
现在,显然在真正的代码中,我希望返回类似注释掉的部分。然而,令人费解的是:
使用此代码,据我所知,每条路径都应该返回一个空字符串。但这不起作用 - 它在结果页面中给了我一个完全空的网格。在调试过程中没有任何错误或任何错误,当我在调试过程中逐步完成它们时,对象看起来很好。
但是,如果我删除此方法中的所有内容,除了返回'';然后它工作正常 - 当然,查询应该在网格中的字段是空的,但所有其他字段都具有应有的所有信息。所以这只是一个考验。但是,应该只能返回空字符串的代码怎么可能不起作用,而只返回空字符串而不执行其他任何操作的代码也可以工作?我很困惑......
答案 0 :(得分:1)
查询参数的含义完全取决于处理URL的应用程序,因此没有“正确”参数 - 可能是w
,q
或searchquery
。您可以做的是启发式搜索最常见的变量(= 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()它就可以了。如果有人知道更好的方法,我会很高兴听到它,否则这至少对我有用。