从URL末尾删除反斜杠

13

下面的代码从输入数据库的网站中删除"www."等前缀。它运行得很好。

我能否使用类似的代码来从输入到同一数据库中的网站尾部删除斜杠?

$remove_array = array('http://www.', 'http://', 'https://', 'https://www.', 'www.');
$site = str_replace($remove_array, "", $_POST['site']);
9个回答

48
你可以传递一个你想要从字符串中去除的字符的字符串给trim函数族。此外,你可以使用rtrim函数来仅去除字符串末尾的字符:
$site = rtrim($site, "/");

5
正则表达式是大炮,尾随斜杠只是麻雀。虽然我不仅会删除尾随斜杠,还会删除空格、制表符和换行符:$site = rtrim($site, "/ \t\n\r"); - stefs
8
此处提到,rtrim函数将移除所有尾部的斜线,例如:$site = 'http://foo.bar//////';而正则表达式只会移除一个尾部的斜线。 - stefs
2
这应该是被接受的答案。除非确实必须使用正则表达式,否则不要使用它们。 - Aaron Hill

25
$site = preg_replace('{/$}', '', $site);

这个使用了相对简单的正则表达式。符号$表示只匹配字符串末尾的斜杠,所以它不会移除stackoverflow.com/questions/中的第一个斜杠。花括号{}只是分隔符;PHP要求在正则表达式的前后使用匹配字符,这是一些愚蠢的原因。


我认为匹配的字符必须相同,即 { 和 { 而不是 { 和 }。 - alex
此外,当您想要提供标志时,字符非常有用。例如,/[a-z]*/i 表示以不区分大小写的方式匹配所有内容。 - alex
1
(){}[]和<>是例外。在我看来,标志应该是一个单独的参数。95%的时间我没有任何标志,分隔符只是噪音。 - John Kugelman
啊,我明白了,谢谢你告诉我。通常,我会选择使用传统的 / 作为分隔符,但在 http:// 和闭合标签中转义时有些麻烦(如果我认为可以通过正则表达式匹配 XHTML 来处理,则可能不用)。 - alex
我认为他们选择这样的标志是因为其他正则表达式实现中也是一样的。但您可能是正确的,如果重新设计的话,也许最好使用自己的参数。 - alex
分隔符是必要的,因为它称为preg_*,这意味着PHP正则表达式库基于Perl正则表达式(或至少兼容Perl)。在Perl中,不需要引用表达式:$a =~ s/foo/bar/;if ($myVar =~ m#/$#) - Tom Mayfield

8

最简单的方法:

$url = rtrim($url,'/');

Daniel Vandersluis答案的副本。 - Cœur

3

John是第一个提出解决方案的人,我认为他的方案更优雅,但是这里有另一种方案:

$site = implode("/", array_filter(explode("/", $site)));

更新

谢谢。我已经更新了它,现在甚至可以处理像这样的事情。

$site = "///test///test//"; /* to => test/test */

也许这使得它比被接受的答案更酷 ;)

-1 呃,那不应该是一个解决方案 - 也不是。你的代码返回 $site 如原样(我甚至测试过了)。 - stefs

2

这是你想要的吗?

$url = 'http://www.example.com/';

if (substr($url, -1) == '/')
    $url = substr($url, 0, -1);

1
你可以在问号前面加上斜杠,参数中可以有"?"或"/"符号(.com/?price=1),所以你不应该每次都删除它。你只需要删除第一个斜杠"/"在问号"?"之前或者如果没有问号"?"就删除最后一个斜杠"/"。
例如:

https://money.yandex.ru/to/410011131033942/?&question=where?&word=why?&back_url=https://money.yandex.ru/to/410011131033942/&price=1

would be

https://money.yandex.ru/to/410011131033942?&question=where?&word=why?&back_url=https://money.yandex.ru/to/410011131033942/&price=1

https://money.yandex.ru/to/410011131033942/

would be

https://money.yandex.ru/to/410011131033942

这个的PHP代码是:


if(stripos($url, '?')) {
    $url = preg_replace('{/\?}', '?', $url);
} else {
    $url = preg_replace('{/$}', '', $url);
}

0

最优雅的解决方案是使用rtrim()

$url = 'http://www.domain.com/';

$urlWithoutTrailingSlash = rtrim($url, '/');

编辑

我忘了 rtrim();

您还可以尝试玩一下 parse_url()


哇,这个问题有很多解决方案。谢谢! - John

-1
$new_string = preg_replace('|/$|', '', $string);

2
使用正则表达式来完成这样一个简单的任务有些过度kill。rtrim() 函数有什么问题吗? - Decent Dabbler

-2
也许一个更好的解决方案是使用.htaccess,但是PHP也可以通过类似这样的方式来实现:
<?php
    header('location: '.preg_replace("/\/$/","",$_SERVER['REQUEST_URI']));
?>

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