当前位置:  开发笔记 > 编程语言 > 正文

如何从PHP中的URL获取具有相同名称的多个参数

如何解决《如何从PHP中的URL获取具有相同名称的多个参数》经验,为你挑选了4个好方法。

我有一个PHP应用程序,有时必须处理URL中的多个参数具有相同名称的URL.是否有一种简单的方法来检索给定密钥的所有值?PHP $ _GET仅返回最后一个值.

为了使这个具体,我的应用程序是一个OpenURL解析器,可能会得到这样的URL参数:

ctx_ver=Z39.88-2004
&rft_id=info:oclcnum/1903126
&rft_id=http://www.biodiversitylibrary.org/bibliography/4323
&rft_val_fmt=info:ofi/fmt:kev:mtx:book
&rft.genre=book
&rft.btitle=At last: a Christmas in the West Indies. 
&rft.place=London,
&rft.pub=Macmillan and co.,
&rft.aufirst=Charles
&rft.aulast=Kingsley
&rft.au=Kingsley, Charles,
&rft.pages=1-352
&rft.tpages=352
&rft.date=1871

(是的,我知道这很难看,欢迎来到我的世界).请注意,键"rft_id"出现两次:

    rft_id=info:oclcnum/1903126

    rft_id=http://www.biodiversitylibrary.org/bibliography/4323

$_GET只返回http://www.biodiversitylibrary.org/bibliography/4323,早期的值(info:oclcnum/1903126)已被覆盖.

我想要访问这两个值.这可能在PHP?如果没有,有关如何处理这个问题的任何想法?



1> Tomalak..:

就像是:

$query  = explode('&', $_SERVER['QUERY_STRING']);
$params = array();

foreach( $query as $param )
{
  // prevent notice on explode() if $param has no '='
  if (strpos($param, '=') === false) $param += '=';

  list($name, $value) = explode('=', $param, 2);
  $params[urldecode($name)][] = urldecode($value);
}

给你:

array(
  'ctx_ver'     => array('Z39.88-2004'),
  'rft_id'      => array('info:oclcnum/1903126', 'http://www.biodiversitylibrary.org/bibliography/4323'),
  'rft_val_fmt' => array('info:ofi/fmt:kev:mtx:book'),
  'rft.genre'   => array('book'),
  'rft.btitle'  => array('At last: a Christmas in the West Indies.'),
  'rft.place'   => array('London'),
  'rft.pub'     => array('Macmillan and co.'),
  'rft.aufirst' => array('Charles'),
  'rft.aulast'  => array('Kingsley'),
  'rft.au'      => array('Kingsley, Charles'),
  'rft.pages'   => array('1-352'),
  'rft.tpages'  => array('352'),
  'rft.date'    => array('1871')
)



2> benlumley..:

不会对你起作用,因为看起来你不控制查询字符串,但是另一个有效的答案:你可以在名称的末尾加上'[]'而不是解析查询字符串,然后PHP会创建一个数组.项目.

IE:

someurl.php?name[]=aaa&name[]=bbb

会给你一个$ _GET看起来像:

array(0=>'aaa', 1=>'bbb')



3> Stefan Gehri..:

我想你必须$_SERVER['QUERY_STRING']手动解析.

像(未经测试)的东西:

$query = $_SERVER['QUERY_STRING'];
$vars = array();
foreach (explode('&', $query) as $pair) {
    list($key, $value) = explode('=', $pair);
    $vars[] = array(urldecode($key), urldecode($value));
}

这应该给你一个数组$vars:

array(
    array('ctx_ver'     => 'Z39.88-2004'),
    array('rft_id'      => 'info:oclcnum/1903126'),
    array('rft_id'      => 'http://www.biodiversitylibrary.org/bibliography/4323'),
    array('rft_val_fmt' => 'info:ofi/fmt:kev:mtx:book'),
    array('rft.genre'   => 'book'),
    array('rft.btitle'  => 'At last: a Christmas in the West Indies.'),
    array('rft.place'   => 'London'),
    array('rft.pub'     => 'Macmillan and co.'),
    array('rft.aufirst' => 'Charles'),
    array('rft.aulast'  => 'Kingsley'),
    array('rft.au'      => 'Kingsley, Charles'),
    array('rft.pages'   => '1-352'),
    array('rft.tpages'  => '352'),
    array('rft.date'    => '1871')
)

在看过Tomalak的回答之后,我更喜欢他的数据格式,因为它可以通过名字访问特定的密钥.



4> mario..:

没有必要为此使用愚蠢的explode变通办法.一个简单的正则表达式可以更容易地使用多个同名参数来纠正QUERY_STRING:

// Replace `&x=1&x=2` into `x[]=1&x[]=2`
$qs = preg_replace("/(?<=^|&)(\w+)(?==)/", "$1[]", $_SERVER["QUERY_STRING"]);

然后它就像使用一样简单parse_str:

parse_str($qs, $new_GET);

这具有正确解码%xyURL转义的优势.

如果您只想将一个或几个特定参数提取为数组,那么请使用(id|name)而不是(\w+)在正则表达式中.

推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有