2011-05-24 62 views
1

我有back_url从外部给我。我需要生成一个散列并使用此参数重定向到back_urlheader("Location: $back_url?hash=123sdf")。但问题是我不知道back_url的格式。通过GET将参数传递给任何网址通用方式

  • 它可能是www.example.com和我做header("Location: $back_url/?hash=123sdf") sj这很好。
  • 这也许是www.example.com/?param=value,如果我做h eader("Location: $back_url/?hash=123sdf")这是错误的,因为它将是www.example.com/?param=value/?hash=123asd

依此类推。问题是:通过什么方式将参数传递给back_url忽略其格式?

回答

0

写这样的功能:。

private function addUrlParam(array $params, $url){ 
    $parsed = parse_url($url); 
    if(!isset($parsed['query'])) 
    { 
     $slash = ''; 
     if(substr($url, -1) !== '/') 
      $slash = '/'; 
     $start_with = $slash.'?'; 
    } 
    else 
     $start_with = '&'; 

    $scheme = ''; 
    if(!isset($parsed['scheme'])) 
     $scheme = 'http://'; 

    $query = http_build_query($params); 
    return $scheme.$url.$start_with.$query; 
} 

看起来很适合我谢谢大家

5

一个复杂的,但很干净的方法是

  • 使用parse_url()到查询字符串(如果有的话)从URL中提取到一个数组
  • 添加hash到结果数组:$params["hash"] = "1234";
  • 使用http_build_query()将参数粘贴回查询字符串
  • 取回由parse_url()返回的所有组件并将它们粘贴回完整的URL

有一点需要注意的是,这将URL解析为组件,并将它粘贴在一起,所以它很可能不适用于首先破坏的URL。

+0

如果安装了PECL HTTP扩展,则这是首选方式,否则http_build_query不可用。 – 2011-05-24 06:49:24

+0

我认为它与http_build_url具有相同的依赖性。你是对的。 – 2011-05-24 06:53:44

1

如果您有PECL HTTP扩展,使用http_build_url

$url = '...'; 
$hash = '...'; 
$new_url = http_build_url($url, array('hash' => $hash), HTTP_URL_JOIN_QUERY); 

如果你没有http_build_url,您可以使用parse_url找到,如果一个URL的不同部分。那只是把它们粘在一起的问题。 Here's本手册中的解决方案可根据您的需求量身定制。

0

那么,你就需要检测是否有$back_url其他查询参数(或GET变量),并使用?hash=123asd如果没有,或者使用&hash=123asd如果确实有查询参数附加到您的哈希值。

如果你知道$back_url就像http://whatever.com/blah/blah(的重要组成部分,是http://whatever.com一个完整的URL,你可以使用parse_url让所有组件,然后继续佩卡的回答。如果你的$back_urlhttp://...开始,然后前插。正确的价值(我假设http://$_SERVER['host']并再次,继续与佩卡的回答

+0

谢谢大家。我已经使用了你的意见,并写下了适合我的小功能 – trerums 2011-05-24 10:07:45

相关问题