我有这个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=1
0,但如果是?
,请不要将其放在匹配中并忽略它(您不想要像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
会卡在最后吗?如果是-太好了,如果不是。。。你所要求的未必总能解决问题。