用正则表达式删除部分字符串

Bro*_*ke. 6 php regex preg-replace

我试图用正则表达式删除一部分字符串(恰好是一个网址).我正在改进正则表达式,但无法弄清楚如何告诉它字符串之前或之后的内容是可选的.这就是我所拥有的

$string='http://www.example.com/username?refid=22';
$new_string= preg_replace('/[/?refid=0-9]+/', '', $string);
echo $new_string;
Run Code Online (Sandbox Code Playgroud)

我正在尝试删除该?refid=22部分http://www.example.com/username

想法?

编辑 我认为我需要使用正则表达而不是爆炸,因为有时网址看起来像http://example.com/profile.php?id=9999&refid=22在这种情况下我也想删除refid但不得id=9999

ale*_*lex 8

parse_url() 适合解析URL :)

$string = 'http://www.example.com/username?refid=22';

$url = parse_url($string);

// Ditch the query.
unset($url['query']);

echo array_shift($url) . '://' . implode($url);
Run Code Online (Sandbox Code Playgroud)

CodePad.

产量

http://www.example.com/username
Run Code Online (Sandbox Code Playgroud)

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

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

unset($get['refid']);

$url['query'] = http_build_query($get);
Run Code Online (Sandbox Code Playgroud)

CodePad.

产量

http://example.com/profile.php?id=9999
Run Code Online (Sandbox Code Playgroud)

如果您有扩展名,则可以使用重建URL http_build_url().

否则,您可以对用户名/密码/端口进行假设并自行构建.

更新

只是为了好玩,这里是正则表达式的修正.

preg_replace('/\?refid=\d+\z/', '', $string);
Run Code Online (Sandbox Code Playgroud)
  • []是一个角色类.你试图在那里放置一个特定的字符顺序.
  • \逃避角色,不是/.
  • \d是字符类的简短版本[0-9].
  • 我把最后一个字符锚(\z)放在那里因为看起来它总是在你的字符串的末尾.如果没有,请将其删除.