替换查询字符串PHP的特定部分

替换查询字符串PHP的特定部分,php,regex,string,Php,Regex,String,我使用$\u服务器['QUERY\u STRING']获取查询字符串 例如A=123&b=456&c=789 如何从查询字符串中删除b值以获得a=123&c=789,其中b可以是任意长度的任意值,并且是字母数字 非常感谢您的建议。您只需使用$\u GET创建一个变量,并在构建过程中排除b查询字符串: $query_string_new = 'a=' . urlencode($_GET['a']) . '&c=' . urlencode($_GET['c']); $query\u str

我使用
$\u服务器['QUERY\u STRING']
获取查询字符串

例如
A=123&b=456&c=789

如何从查询字符串中删除b值以获得
a=123&c=789
,其中b可以是任意长度的任意值,并且是字母数字


非常感谢您的建议。

您只需使用
$\u GET
创建一个变量,并在构建过程中排除
b
查询字符串:

$query_string_new = 'a=' . urlencode($_GET['a']) . '&c=' . urlencode($_GET['c']);
$query\u string\u new
现在应该包含
a=123&c=789

尝试以下操作:

$query_new = preg_replace('/(^|&)b=[^&]*/', '', $query);

该值将是
$\u GET['b']

那么:

str_replace('&b='.$_GET['b'], '', $_SERVER['QUERY_STRING']);

使用url解析的解决方案:

parse_str($_SERVER['QUERY_STRING'], $result_array);
unset($result_array['b']);
$_SERVER['QUERY_STRING'] = http_build_query($result_array);

所有答案看起来都不错,但如果你这样做,答案会更灵活:

// Make a copy of $_GET to keep the original data
$getCopy = $_GET;
unset($getCopy['b']); // or whatever var you want to take out

// This is your cleaned array
var_dump($getCopy);

// If you need the URL-encoded string, just use http_build_query()
$encodedString = http_build_query($getCopy);

您可以使用此功能:

function Remove_QS_Key($url, $key) {
$url = preg_replace('/(?:&|(\?))'.$key.'=[^&]*(?(1)&|)?/i', "$1", $url);
return $url;
}
要删除所需的任何密钥,例如

echo Remove_QS_Key("http://domain.com/?a=b&ref=dusername&c=d&e=f&g=h", "ref");
结果

http://www.domain.com/?a=b&c=d&e=f&g=h
Pear已经有一个类(Net_URL2)来处理URL解析/构建:

通过Composer安装: 安装方式包括:

示例代码:

$url = new Net_URL2('http://www.example.com/?one=1');
$url->setQueryVariable('two', 2);
echo $url; // http://www.example.com/?one=1&two=2


肯定是这样的。您可以使用现有的
$\u GET
而不是执行初始的
parse_str()
unset($\u GET['b'])$qs=http\u build\u query($\u GET)
不同之处在于,我的答案只影响
$\u服务器['QUERY\u STRING']
变量,并使$\u保持不变,以防出于某种原因仍然需要它。否决投票的原因是什么?请不要说“哦,你在使用正则表达式!太糟糕了!”使用正则表达式可以替换参数在查询字符串中的任何位置
str_replace('&b='.$\u GET['b'],'',$\u SERVER['QUERY_STRING'])
如果它是查询字符串中的第一个参数,则不替换它。@kiamaluno:完全正确。这就是我选择正则表达式搜索的原因@Gumbo:我认为,有时候问题的始作俑者给出的代码过于字面化;参数
b
显示在第二个位置并不意味着它应该始终位于第二个位置。OP要求删除该参数,但他没有说它始终是第二个参数,也从来不是第一个参数。这就是为什么我认为你的答案和其他答案一样有效。如果OP更喜欢数组而不是字符串,那么OP应该报告这一点。别忘了正确转义输出。如果a和c不是十进制值怎么办?@Gumbo:你到底是什么意思?你是在问还是需要在这里提出建议?@sAc:如果你使用
urlencode
而不是
intval
,那么,它可以用于任何值。我喜欢这个。谢谢。如果值包含需要编码的字符,此解决方案将失败。例如,我的回答评论(见)中的榴弹片上校的评论。啊,是的。但是你可以很容易地解决这个问题,把$_-GET['b']包装在一个解码的东西里。如果在
b=
之前有一个
呢?在PHP5.3中,
$getCopy=$\u-GET
不会创建一个副本,但是它会创建一个对
$\u-GET
的引用。我的代码中也有同样的问题,我想保留另一个函数使用的
$\u GET
的值;我使用了
$query=$\u GET;unset($query['q'];
,结果是另一个函数(直接访问
$\u GET
)无法检索
$\u GET['q']
。据我所知,要创建引用,您需要执行
$getCopy=&$\u GET
..@ilarra:这是正确的;在PHP5.3中,只有对象通过引用传递。即使替换
$query=$\u GET;unset($query['q'),我也无法概括我报告的代码
通过循环解决了我的代码中存在的问题。所以,摇滚乐吧,但你不是。因为你接受了一个无法替换多种数据的解决方案。@Col.Shrapnel:解决方案将无法替换什么样的数据?OP可能会对查询参数只包含数字的情况感兴趣(如示例查询中所述);如果是这种情况,建议的解决方案将起作用。@kiamlaluno如果您将此网站视为“让我们回答所有蹩脚的问题,然后忘记它”,那么就可以了。但有人认为此网站是知识的最终来源,在这里,答案可以使用的范围超过once@pondpad:请参阅对我的答案的评论().@Col.Shrapnel:问题是具体的,我不认为有人能说这里给出的回答一般都是有效的。一般来说,对一个问题的回答在其他情况下是无效的;如果在某种情况下解决方案是使用正则表达式,那并不意味着应该总是使用正则表达式。