如何在PHP中从URL字符串中提取查询参数?

25

用户可以使用我网站上的HTML表单输入URL,因此他们可能会输入这样的内容:http://www.example.com?test=123&random=abc,它可以是任何东西。 我需要提取某个查询参数的值,在这种情况下是“test”(值为123)。 有没有办法做到这一点?


4
可能是解析查询字符串的正则表达式的重复问题。 - Gordon
虽然这是一个重复问题,但是parse_url的解决方案会导致新的问题,请看下面我的回复给用户576875。 - soren.qvist
1
你可以使用strstrexplode函数提取以?开头的字符串,然后将其传递给parse_str函数进行解析。 - Gordon
看起来我可以使用strstr,谢谢Gordon。 - soren.qvist
3个回答

65

您可以这样使用parse_urlparse_str

$query = parse_url('http://www.example.com?test=123&random=abc', PHP_URL_QUERY);
parse_str($query, $params);
$test = $params['test'];

parse_url函数可用于将URL分解为不同的部分(如协议、主机、路径、查询等),在此我们使用它仅获取查询参数(test=123&random=abc)。然后,我们可以使用parse_str函数解析查询参数。


看起来当使用某些URL时,parse_url会抛出PHP错误,请查看php.net上的此评论:http://www.php.net/manual/en/function.parse-url.php#96433 - soren.qvist
1
是的,看起来它在没有“host”组件的URL上无法工作。这将适用于有效的类HTTP的URL。 - Arnaud Le Blanc
那么,有其他的方法来做这件事吗? - soren.qvist
$query = parse_url('?test=123&random=abc', PHP_URL_QUERY); 它不需要URL中的主机,只需要问号(?)和参数。 - Hugo Ferreira

2

我需要检查我们系统中的相对URL,所以无法使用parse_str。如果有人需要,可以参考以下方法:

$urlParts = null;
preg_match_all("~[\?&]([^&]+)=([^&]+)~", $url, $urlParts);

只是出于好奇,你的系统为什么不支持原生的PHP函数呢? - vallentin
@Vallentin - parse_str() 函数是在 PHP 4 中引入的... 可能(但很不可能)他使用的是更早版本的 PHP。 - Cliff Burton

1
主机名可选,但至少需要在参数字符串开头加一个问号:
$inputString = '?test=123&random=abc&usersList[]=1&usersList[]=2' ;

parse_str ( parse_url ( $inputString , PHP_URL_QUERY ) , $params );

print_r ( $params );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接