PHP - 将多个斜杠减少为单斜杠

发布于 2024-08-20 02:47:25 字数 570 浏览 3 评论 0原文

我有一个正则表达式,用于将多个斜杠减少为单个斜杠。目的是读取之前使用 apache 中的 mod_rewrite 转换为人类可读链接的 url,如下所示:

http://www.website.com/about/me

这有效:

$uri = 'about//me';
$uri = preg_replace('#//+#', '/', $uri);
echo $uri; // echoes 'about/me'

这不起作用:

$uri = '/about//me';
$uri = preg_replace('#//+#', '/', $uri);
echo $uri; // echoes '/about/me'

我需要能够单独使用每个 url 参数,但在第二个中例如,如果我分解尾部斜杠,它将返回 3 个段而不是 2 个段。如果参数为空,我可以在 PHP 中验证是否有任何参数,但是当我使用该正则表达式时,如果正则表达式已经为我解决了这个问题,那就太好了,这样我就不需要担心段验证。

有什么想法吗?

I have a regular expression that I use to reduce multiple slashes to single slashes. The purpose is to read a url that is previously converted to a human readable link using mod_rewrite in apache, like this :

http://www.website.com/about/me

This works :

$uri = 'about//me';
$uri = preg_replace('#//+#', '/', $uri);
echo $uri; // echoes 'about/me'

This doesn't work :

$uri = '/about//me';
$uri = preg_replace('#//+#', '/', $uri);
echo $uri; // echoes '/about/me'

I need to be able to work with each url parameter alone, but in the second example, if I explode the trailling slash, it would return me 3 segments instead of 2 segments. I can verify in PHP if any if the parameters is empty, but as I'm using that regular expression, it would be nice if the regular expression already take care of that for me, so that I don't need to worry about segment validation.

Any thoughts?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

追我者格杀勿论 2024-08-27 02:47:25

在这种情况下 str_replace 可能会更快

$uri = str_replace("//","/",$uri)

其次:使用修剪: http://hu.php .net/manual/en/function.trim.php

$uri = trim($uri,"/");

str_replace may be faster in this case

$uri = str_replace("//","/",$uri)

Secondly: use trim: http://hu.php.net/manual/en/function.trim.php

$uri = trim($uri,"/");
舂唻埖巳落 2024-08-27 02:47:25

这会将字符串中的双斜杠转换为单斜杠,但此代码的优点是保留字符串的协议部分 (http://) 中的斜杠。

preg_replace("#(^|[^:])//+#", "\\1/", $str);

This converts double slashes in a string to a single slash, but the advantage of this code is that the slashes in the protocol portion of the string (http://) are kept.

preg_replace("#(^|[^:])//+#", "\\1/", $str);
在你怀里撒娇 2024-08-27 02:47:25

对 $uri 运行第二次替换怎么样?

$uri = preg_replace('#^/#', '', $uri);

这样,尾部的斜杠就被删除了。一次完成这一切 preg_replace 打败了我:)
使用 ltrim 也可能是一种方法(可能甚至更快)。

How about running a second replace on $uri?

$uri = preg_replace('#^/#', '', $uri);

That way a trailing slash is removed. Doing it all in one preg_replace beats me :)
Using ltrim could also be a way to go (probably even faster).

吲‖鸣 2024-08-27 02:47:25

我需要能够与每个人一起工作
单独的 url 参数,但在第二个
例如,如果我爆炸尾部
斜杠,它会返回 3 段
而不是 2 段。

解决此问题的一种方法是使用 preg_split,并将第三个参数设置为 PREG_SPLIT_NO_EMPTY

$uri = '/about//me';
$uri_segments = preg_split('#/#', $uri, PREG_SPLIT_NO_EMPTY);
// $uri_segments[0] == 'about';
// $uri_segments[1] == 'me';

I need to be able to work with each
url parameter alone, but in the second
example, if I explode the trailling
slash, it would return me 3 segments
instead of 2 segments.

One fix for this is to use preg_split with the third argument set to PREG_SPLIT_NO_EMPTY:

$uri = '/about//me';
$uri_segments = preg_split('#/#', $uri, PREG_SPLIT_NO_EMPTY);
// $uri_segments[0] == 'about';
// $uri_segments[1] == 'me';
留蓝 2024-08-27 02:47:25

您可以将所有三种替代方案组合成一个正则表达式

$urls = array(
   'about/me',
   '/about//me',
   '/about///me/',
   '////about///me//'
);

print_r(
     preg_replace('~^/+|/+$|/(?=/)~', '', $urls)
);

you can combine all three alternatives into one regexp

$urls = array(
   'about/me',
   '/about//me',
   '/about///me/',
   '////about///me//'
);

print_r(
     preg_replace('~^/+|/+$|/(?=/)~', '', $urls)
);
梅窗月明清似水 2024-08-27 02:47:25

您可以通过 preg_split 拆分字符串,完全跳过清理过程。不过,您仍然需要处理空块。

You may split the string via preg_split instead, skipping the sanitizing altogether. You still have to deal with the empty chunks, though.

清风疏影 2024-08-27 02:47:25

晚了,但所有这些方法也会删除 http:// 斜线,但是这个。

function to_single_slashes($input) {
    return preg_replace('~(^|[^:])//+~', '\\1/', $input);
}

# out: http://localhost/lorem-ipsum/123/456/
print to_single_slashes('http:///////localhost////lorem-ipsum/123/////456/');

Late but all these methods will remove http:// slashes too, but this.

function to_single_slashes($input) {
    return preg_replace('~(^|[^:])//+~', '\\1/', $input);
}

# out: http://localhost/lorem-ipsum/123/456/
print to_single_slashes('http:///////localhost////lorem-ipsum/123/////456/');
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文