Php 使用正则表达式删除字符串的一部分

Php 使用正则表达式删除字符串的一部分,php,regex,preg-replace,Php,Regex,Preg Replace,我试图用正则表达式剥离字符串的一部分(正好是url)。我越来越了解正则表达式,但不知道如何告诉它字符串前后的内容是可选的。这是我的 $string='http://www.example.com/username?refid=22'; $new_string= preg_replace('/[/?refid=0-9]+/', '', $string); echo $new_string; 我正在尝试删除?refid=22部分以获取http://www.example.com/username

我试图用正则表达式剥离字符串的一部分(正好是url)。我越来越了解正则表达式,但不知道如何告诉它字符串前后的内容是可选的。这是我的

$string='http://www.example.com/username?refid=22';
$new_string= preg_replace('/[/?refid=0-9]+/', '', $string);
echo $new_string;
我正在尝试删除
?refid=22
部分以获取
http://www.example.com/username

想法

编辑 我想我需要使用Regex而不是explode,因为有时候url看起来像
http://example.com/profile.php?id=9999&refid=22
在这种情况下,我还想删除
refid
,但不获取
id=9999

用于解析URL:)

输出 如果您只想删除特定的GET参数,请执行以下操作

parse_str($url['query'], $get);

unset($get['refid']);

$url['query'] = http_build_query($get);

输出 如果您有扩展名,可以使用重建URL

否则,您可以假设用户名/密码/端口,然后自己构建它

更新 为了好玩,这里是对正则表达式的更正

preg_replace('/\?refid=\d+\z/', '', $string);
  • []
    是一个字符类。你想把一个特定的字符顺序放进去
  • \
    是转义字符,而不是
    /
  • \d
    是字符类
    [0-9]
    的一个简短版本
  • 我将最后一个字符定位(
    \z
    )放在那里,因为它似乎总是在字符串的末尾。如果没有,请将其拆下

如果不需要,请不要使用正则表达式

echo current( explode( '?', $string ) );

@BandonRandon我上面的代码介绍了您只想删除一个GET参数的情况。@alex,这个方法比正则表达式快吗?@Bandon正则表达式通常比较慢。无论如何,这个方法应该更容易阅读,这才是重要的。@Alex,很抱歉让你感到痛苦,但URL似乎是用
%3B
编码的,它是
的十六进制
@Bandon您使用的输入字符串是什么?
http://example.com/profile.php?id=9999
preg_replace('/\?refid=\d+\z/', '', $string);
echo current( explode( '?', $string ) );