用php删除GET变量的函数


Function to remove GET variable with php

我有这个URI。

http://localhost/index.php?properties&status=av&第1页

我正在使用以下代码获取URI的基本名称。

$basename = basename($_SERVER['REQUEST_URI']);

上面的代码给了我下面的字符串。

index.php?属性&status=av&第1页

我想要从字符串中移除最后一个变量,即CCD_ 1。请注意,page的值并不总是1。记住这一点,我想以这种方式修剪变量。

从字符串的最后一个位置修剪到第一个分隔符,即&

更新:

我想从字符串中删除&page=1,无论它在哪个位置。

我该怎么做?

不应该使用正则表达式,而应该将字符串解析为url(它是什么(

$string = 'index.php?properties&status=av&page=1';
$parts = parse_url($string);
$queryParams = array();
parse_str($parts['query'], $queryParams);

现在只需删除参数

unset($queryParams['page']);

并重建url

$queryString = http_build_query($queryParams);
$url = $parts['path'] . '?' . $queryString;

通往罗马的道路很多。我会用RegEx:

$myString = 'index.php?properties&status=av&page=1';
$myNewString = preg_replace("/'&[a-z0-9]+=[0-9]+$/i","",$myString);

如果您只想要&page=1类型的参数,最后一行将是

$myNewString = preg_replace("/'&page=[0-9]+/i","",$myString);

如果你还想摆脱页面是唯一或第一个参数的可能性:

$myNewString = preg_replace("/['&]*page=[0-9]+/i","",$myString);

谢谢大家,但我认为我找到了更好的解决方案,@KingCrunch提出了一个我扩展并将其转换为函数的解决方案。下面的函数可以删除或取消设置任何URI变量,而无需使用任何regex技巧。我把它贴出来,因为它可能会帮助别人。

function unset_uri_var($variable, $uri) {   
    $parseUri = parse_url($uri);
    $arrayUri = array();
    parse_str($parseUri['query'], $arrayUri);
    unset($arrayUri[$variable]);
    $newUri = http_build_query($arrayUri);
    $newUri = $parseUri['path'].'?'.$newUri;
    return $newUri;
}

现在考虑下面的uri

index.php?properties&status=av&page=1
//To remove properties variable
$url = unset_uri_var('properties', basename($_SERVER['REQUEST_URI']));
//Outputs index.php?page=1&status=av
//To remove page variable
$url = unset_uri_var('page', basename($_SERVER['REQUEST_URI']));
//Outputs index.php?properties=&status=av

希望这能帮助到别人。感谢@KingKrunch的解决方案:(

$pos = strrpos($_SERVER['REQUEST_URI'], '&');    
$url = substr($_SERVER['REQUEST_URI'], 0, $pos - 1);

strrpos的文档。

Regex适用于所有可能的情况:/(&|(?<='?))page=.*?(?=&|$)/。下面是示例代码:

$regex = '/(&|(?<='?))page=.*?(?=&|$)/';
$urls = array(
        'index.php?properties&status=av&page=1',
        'index.php?properties&page=1&status=av',
        'index.php?page=1',
);
foreach($urls as $url) {
        echo preg_replace($regex, '', $url), "'n";
}

输出:

index.php?properties&status=av
index.php?properties&status=av
index.php?

Regex解释:

  • (&|(?<='?))——匹配&&page=10,但如果是?,请不要将其放在匹配中并忽略它(您不想要像index.php&status=av这样的URL(
  • page=.*?--与page=[...]匹配
  • (?=&|$)——查找&或字符串的末尾($(,但不包括它们作为替换(此组可帮助前一个查找停止匹配的确切位置(

您可以使用RegEx(正如Chris所建议的(,但这不是最有效的解决方案(使用该引擎会产生大量开销……很容易进行一些字符串解析:

<?php
//$url="http://localhost/index.php?properties&status=av&page=1";
$base=basename($_SERVER['REQUEST_URI']);
echo "Basename yields: $base<br />";
//Find the last ampersand
$lastAmp=strrpos($base,"&");
//Filter, catch no ampersands found
$removeLast=($lastAmp===false?$base:substr($base,0,$lastAmp));
echo "Without Last Parameter: $removeLast<br />";
?>

问题是,你能保证$page会卡在最后吗?如果是-太好了,如果不是。。。你所要求的未必总能解决问题。