PHP preg_replace 表达式删除 URL 参数

Posted

技术标签:

【中文标题】PHP preg_replace 表达式删除 URL 参数【英文标题】:PHP preg_replace expression to remove URL parameter 【发布时间】:2013-03-24 20:51:39 【问题描述】:

我想使用 preg_expression 从 URL 中删除所有出现的特定参数模式。如果存在,还删除最后一个“&” 模式如下:make=xy(“make”是固定的;“xy”可以是任意两个字母)

例子:

http://example.com/index.php?c=y&make=yu&do=ms&r=k&p=7&

处理preg_replace后,结果应该是:

http://example.com/index.php?c=y&do=ms&r=k&p=7

我尝试使用:

$url = "index.php?ok=no&make=ae&make=as&something=no&make=gr";
$url = preg_replace('/(&?lang=..&?)/i', '', $url);

但是,这并没有很好地工作,因为我的 URL 中有 make=xx 的重复项(这种情况可能发生在我的应用程序中)。

【问题讨论】:

你为什么要使用lang来替换make 抱歉 lang 本来就是要制作的。 【参考方案1】:

你不需要正则表达式:

$url = "http://example.com/index.php?ok=no&make=ae&make=as&something=no&make=gr&";

list($file, $parameters) = explode('?', $url);
parse_str($parameters, $output);
unset($output['make']); // remove the make parameter

$result = $file . '?' . http_build_query($output); // Rebuild the url
echo $result; // http://example.com/index.php?ok=no&something=no

【讨论】:

【参考方案2】:

您可以尝试使用:

$str = parse_url($url, PHP_URL_QUERY);
$query = array();
parse_str($str, $query);
var_dump($query);

这会将查询作为数组返回给您。然后,您可以使用 http_build_query() 函数来恢复查询字符串中的数组。

但是如果你想使用正则表达式:

$url = "index.php?make=ae&ok=no&make=ae&make=as&something=no&make=gr";
echo $url."\n";
$url = preg_replace('/\b([&|&]0,1make=[^&]*)\b/i','',$url);
$url = str_replace('?&','?',$url);
echo $url;

这将删除 URL 中的所有 make

【讨论】:

这两种方法都不适合我。第一种方法返回 NULL,第二种方法返回奇怪的输出 我编辑了帖子,在我的测试中,正则表达式运行良好。在第一种方式中,我忘记了 parse_str 具有通过引用传递的数组,并且没有返回它。【参考方案3】:

使用rtrim,您可以删除最后一个&

$url = rtrim("http://example.com/index.php?c=y&make=yu&do=ms&r=k&p=7&","&");
$url = preg_replace('~&make=([a-z\-]*)~si', '', $url);

【讨论】:

如果make 直接出现在index.php? 之后,则不会被替换。此外,所有make= 的值也不会被删除【参考方案4】:
$url = "index.php?ok=no&make=ae&make=as&something=no&make=gr";
$url = preg_replace('/(&?make=[a-z]2)/i', '', $url);
echo $url;

【讨论】:

如果$url = "index.php?make=xx&ok=no" .. 结果会在index? 之后留下额外的& .. 这是不正确的【参考方案5】:

只需使用 preg_replace

$x = "http://example.com/index.php?c1=y&make=yu&do1=ms&r1=k&p1=7&";

$x = preg_replace(['/(\?make=[a-z]*[&])/i', '/(\&make=[a-z]*[^(&*)])/i', '/&(?!\w)/i'], ['?','',''], $x);
echo $x;

结果是:http://example.com/index.php?c1=y&do1=ms&r1=k&p1=7

希望对大家有所帮助。

【讨论】:

以上是关于PHP preg_replace 表达式删除 URL 参数的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式:安全、快速地删除非字母 UTF-8

PHP php使用preg_replace从文本中删除特殊字符

[PHP] PHP7已经删除了preg_replace的e修饰符

php 中preg_replace执行一个正则表达式的搜索和替换

PHP preg_replace - 正则表达式

PHP中使用正则表达式详解 preg_match() preg_replace() preg_mat