如果路径字符串的最后一个字符是斜杠,则删除它。

14
我正在使用PHP进行URL重写,需要查找以斜杠结尾的URL并执行301重定向。我认为应该有一个简单的PHP函数可以查找最后一个字符串,但我找不到任何东西。我的第一直觉是需要使用正则表达式,但我不能确定。
以下是一个示例: http://domainx.com/characters/
我想查找末尾的斜杠,并将其转换为http://domainx.com/characters
那么,哪个函数可以帮助我检查最后一个字符是否为“/”?

有10多种方法可以做到这一点! - Salman A
如果$s($str)末尾是'/', 则执行:if (s($str)->endsWith('/'))重定向至$s($str), 并替换最后一个"/": header('Location: '.s($str)->replaceLast('/'))以上代码可以在这个独立库中找到: https://github.com/delight-im/PHP-Str不过,对于重定向,使用Web服务器(例如,Apache使用"mod_rewrite")可能更简单。 - caw
8个回答

51

一个不错的解决方案,可以安全地删除最后一个 / ,是使用

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

rtrim()函数会在字符串右侧存在一个或多个斜线时,移除该字符串上所有的斜线。

你也可以安全地在URL末尾添加一个斜线:

$string = rtrim($string, '/').'/';

33
您可以使用 substr 函数:
substr($str, -1)

这会返回单字节字符串中的最后一个字节/字符。请参阅多字节字符串变量mb_substr

但是,如果您只想删除任何尾随斜线,则rtrim可能是最佳解决方案。

既然您正在处理URL,您可能还需要查看parse_url,以将URL解析为尾随斜杠不需要成为URL路径的一部分。


14

$string[strlen($string)-1]给你最后一个字符。

但如果你想要去掉尾部斜杠,可以使用$string = rtrim($string, '/');。如果没有尾部斜杠,$string将保持不变。


3
substr($string,-1) 很棒 :) - Rami Dabain

4

您可以使用basename()

这将返回characters,对于http://domainx.com/characters/http://domainx.com/characters都适用。

您可以像这样操作:

$page = $_SERVER['REQUEST_URI'];
$module = basename($page);

那么你可以直接在条件逻辑中使用$module而不需要进行任何重定向。

如果您想收集最后一个去除了/的URL,那么可以这样做:-

如果您将项目基础URL存储在配置文件中:

BASE_URL  = 'http://example.com'

那么你可以这样做:-
$page = $_SERVER['REQUEST_URI'];
$module = basename($page);
$trimmedUrl = BASE_URL.'/'.$module;

1
如果您的php版本大于7.1
$string[-1]

将会给你最后一个字符。

http://sandbox.onlinephpfunctions.com/code/ff439889f14906749e4eb6328796c354c60f269b

rtrim 和自定义函数的区别:
<?php

$string0 = 'hi//';
$string1 = 'hello/';
$string2 = 'world';

function untrailingslashit( $string ) {
    return $string[-1] === '/' ? substr( $string, 0, -1) : $string;
}

echo untrailingslashit($string0);
echo "\n";
echo untrailingslashit($string1);
echo "\n";
echo untrailingslashit($string2);
echo "\n";
echo rtrim($string0, "/");

结果:

hi/
hello
world
hi

这不会删除最后一个斜杠。 - mickmackusa

1
你可以在主体末尾使用/preg_replace()
$url = 'http://domainx.com/characters/';
$url = preg_replace('/(?:\/)$/', '', $url);

非捕获组并不是必需的。~/$~将会做同样的事情。 - mickmackusa

0

使用 PHP 8

str_ends_with($string, '/');

新增了str_starts_with()str_ends_with()函数至核心代码。


这不会删除最后一个斜杠。 - mickmackusa

-1

这是直接来自WordPress:

function untrailingslashit( $string ) {
    return rtrim( $string, '/\\' );
}

此页面已经推荐使用rtrim()函数。 - mickmackusa
但我的解决方案被封装为一个函数,并且包含转义斜杠。它还经过了对建立在WordPress上的数百万个网站的尝试和测试。 - Ciprian
将单个本地函数调用包装在自定义函数中并不是有益的编程方式。这个问题只需要去除前斜杠,没有必要去除后斜杠。 - mickmackusa

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