我在powerpoint演示文稿中有一些链接,出于某种原因,当点击这些链接时,它会向URL添加一个返回参数.好吧,那个返回参数导致我的Joomla网站的MVC模式被搞砸了.
那么,使用PHP剥离这个返回参数的有效方法是什么?
示例:http: //mydomain.com/index.php?id = 115&Itemid = 238 &return = aHR0cDovL2NvbW11bml0
Mar*_*c B 82
最安全的"正确"方法是:
parse_url()parse_str()unset()从数组中删除它们所需的查询参数http_build_query()快速而肮脏的是使用字符串搜索/替换和/或正则表达式来消除该值.
Lar*_*dal 54
Justin建议最快的方法是使用strtok()
$url = strtok($url, '?');
Run Code Online (Sandbox Code Playgroud)
请参阅速度测试的完整答案:https://stackoverflow.com/a/1251650/452515
Ser*_*sky 22
这是用一个例子来补充Marc B的答案,虽然它可能看起来很长,但它是一种删除参数的安全方法.在这个例子中我们删除page_number
<?php
$x = 'http://url.com/search/?location=london&page_number=1';
$parsed = parse_url($x);
$query = $parsed['query'];
parse_str($query, $params);
unset($params['page_number']);
$string = http_build_query($params);
var_dump($string);
Run Code Online (Sandbox Code Playgroud)
Nik*_*kiC 12
parse_str($queryString, $vars);
unset($vars['return']);
$queryString = http_build_query($vars);
Run Code Online (Sandbox Code Playgroud)
parse_str解析查询字符串,http_build_query创建查询字符串.
你可以这样做preg_replace:
$new_url = preg_replace('/&?return=[^&]*/', '', $old_url);
Run Code Online (Sandbox Code Playgroud)
这是众多方法中的一种,未经测试,但应该有效.
$link = 'http://mydomain.com/index.php?id=115&Itemid=283&return=aHR0cDovL2NvbW11bml0';
$linkParts = explode('&return=', $link);
$link = $linkParts[0];
Run Code Online (Sandbox Code Playgroud)
以下是上述"最安全'正确'方法"的实际代码......
function reduce_query($uri = '') {
$kill_params = array('gclid');
$uri_array = parse_url($uri);
if (isset($uri_array['query'])) {
// Do the chopping.
$params = array();
foreach (explode('&', $uri_array['query']) as $param) {
$item = explode('=', $param);
if (!in_array($item[0], $kill_params)) {
$params[$item[0]] = isset($item[1]) ? $item[1] : '';
}
}
// Sort the parameter array to maximize cache hits.
ksort($params);
// Build new URL (no hosts, domains, or fragments involved).
$new_uri = '';
if ($uri_array['path']) {
$new_uri = $uri_array['path'];
}
if (count($params) > 0) {
// Wish there was a more elegant option.
$new_uri .= '?' . urldecode(http_build_query($params));
}
return $new_uri;
}
return $uri;
}
$_SERVER['REQUEST_URI'] = reduce_query($_SERVER['REQUEST_URI']);
Run Code Online (Sandbox Code Playgroud)
但是,由于这可能存在于应用程序的引导程序之前,因此您应该将其放入匿名函数中.像这样...
call_user_func(function($uri) {
$kill_params = array('gclid');
$uri_array = parse_url($uri);
if (isset($uri_array['query'])) {
// Do the chopping.
$params = array();
foreach (explode('&', $uri_array['query']) as $param) {
$item = explode('=', $param);
if (!in_array($item[0], $kill_params)) {
$params[$item[0]] = isset($item[1]) ? $item[1] : '';
}
}
// Sort the parameter array to maximize cache hits.
ksort($params);
// Build new URL (no hosts, domains, or fragments involved).
$new_uri = '';
if ($uri_array['path']) {
$new_uri = $uri_array['path'];
}
if (count($params) > 0) {
// Wish there was a more elegant option.
$new_uri .= '?' . urldecode(http_build_query($params));
}
// Update server variable.
$_SERVER['REQUEST_URI'] = $new_uri;
}
}, $_SERVER['REQUEST_URI']);
Run Code Online (Sandbox Code Playgroud)
注意:更新urldecode()为避免双重编码via http_build_query()功能.注意:更新ksort()为允许没有错误的参数没有错误.
function removeParam($url, $param) {
$url = preg_replace('/(&|\?)'.preg_quote($param).'=[^&]*$/', '', $url);
$url = preg_replace('/(&|\?)'.preg_quote($param).'=[^&]*&/', '$1', $url);
return $url;
}
Run Code Online (Sandbox Code Playgroud)
在完善Sergey Telshevsky的答案后,Marc B的答案的程序实施.
function strip_param_from_url( $url, $param )
{
$base_url = strtok($url, '?'); // Get the base url
$parsed_url = parse_url($url); // Parse it
$query = $parsed_url['query']; // Get the query string
parse_str( $query, $parameters ); // Convert Parameters into array
unset( $parameters[$param] ); // Delete the one you want
$new_query = http_build_query($parameters); // Rebuilt query string
return $base_url.'?'.$new_query; // Finally url is ready
}
// Usage
echo strip_param_from_url( 'http://url.com/search/?location=london&page_number=1', 'location' )
Run Code Online (Sandbox Code Playgroud)