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

8

我正在尝试使用正则表达式来截取字符串的一部分(该字符串恰好是一个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看起来像这样 http://example.com/profile.php?id=9999&refid=22 在这种情况下,我也想删除 refid 但不获取 id=9999

2个回答

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);

CodePad.

Output

http://www.example.com/username

如果您只想删除特定的GET参数,请按照以下步骤进行操作...
parse_str($url['query'], $get);

unset($get['refid']);

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

CodePad.

Output

http://example.com/profile.php?id=9999

如果您安装了扩展程序,可以使用http_build_url()重新构建URL。

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

更新

仅供娱乐,这是您正则表达式的更正。

preg_replace('/\?refid=\d+\z/', '', $string);
  • [] 是字符类。你试图将一组特定的字符放在其中。
  • \ 是转义字符,不是 /
  • \d 是字符类 [0-9] 的简写形式。
  • 我加入了最后一个字符锚点 (\z),因为它似乎总是出现在字符串的末尾。如果不是,请删除它。

@alex,这种方法比正则表达式更快/标准吗? - Brooke.
@Bandon 正则表达式通常比较慢。不过,这种方法应该更易于阅读,这才是最重要的。 - alex
@Bandon 你输入的字符串是什么? - alex
@alex,它正在获取Facebook URL并解析它,然后WordPres对其进行编码。我不确定%3B来自哪里。我尝试了urldecode - Brooke.
@Alex,我也是:) 哦,好吧,我只是用unset($get[';refid']); unset($get['refid']);这种迂回的方式解决了问题。 - Brooke.
显示剩余2条评论

4

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接