以下是几种在 PHP 中只去除 URL 结尾斜杠的方法:

方法一:使用 rtrim() 函数(最简单)

$url = "https://example.com/test/";
$cleaned = rtrim($url, '/');
echo $cleaned; // 输出: https://example.com/test

方法二:使用正则表达式

$url = "https://example.com/test//";
$cleaned = preg_replace('/\/+$/', '', $url);
echo $cleaned; // 输出: https://example.com/test

方法三:条件判断 + substr()

function removeTrailingSlash($url) {
    // 只去除结尾的斜杠,不去除开头的
    while (substr($url, -1) === '/') {
        $url = substr($url, 0, -1);
    }
    return $url;
}

$url = "https://example.com/test///";
echo removeTrailingSlash($url); // 输出: https://example.com/test

方法四:更健壮的解决方案

function removeUrlTrailingSlash($url) {
    // 如果URL为空,直接返回
    if (empty($url)) {
        return $url;
    }
    
    // 使用rtrim去除结尾斜杠
    $url = rtrim($url, '/');
    
    // 特殊情况:如果整个URL就是斜杠,rtrim会返回空字符串
    // 这时候我们可能想保留一个斜杠(比如根目录)
    if ($url === '' && strpos($url, '/') === 0) {
        return '/';
    }
    
    return $url;
}

实际应用示例

// 1. 处理URL路径
$urls = [
    "https://example.com/",
    "https://example.com/test/",
    "https://example.com/test//",
    "/",
    "/test/",
    "test/",
    "https://example.com/test?param=value/",
];

foreach ($urls as $url) {
    echo "原始: $url\n";
    echo "处理: " . rtrim($url, '/') . "\n\n";
}

// 2. 构建URL时的应用
function buildUrl($base, $path = '') {
    $base = rtrim($base, '/');
    
    if (!empty($path)) {
        // 确保路径以斜杠开头
        if (strpos($path, '/') !== 0) {
            $path = '/' . $path;
        }
        $path = rtrim($path, '/');
    }
    
    return $base . $path;
}

echo buildUrl('https://example.com/', 'api/v1/users/');
// 输出: https://example.com/api/v1/users

// 3. 处理文件路径(同样是去除结尾斜杠)
$filePath = "/var/www/html/uploads/";
$cleanPath = rtrim($filePath, '/');
echo $cleanPath; // 输出: /var/www/html/uploads

针对不同场景的处理

// 场景1:只去除路径部分的结尾斜杠(保持查询参数完整)
function removeTrailingSlashFromPath($url) {
    $parts = parse_url($url);
    
    if (isset($parts['path'])) {
        $parts['path'] = rtrim($parts['path'], '/');
    }
    
    // 重新构建URL
    $scheme   = isset($parts['scheme']) ? $parts['scheme'] . '://' : '';
    $host     = isset($parts['host']) ? $parts['host'] : '';
    $port     = isset($parts['port']) ? ':' . $parts['port'] : '';
    $user     = isset($parts['user']) ? $parts['user'] : '';
    $pass     = isset($parts['pass']) ? ':' . $parts['pass']  : '';
    $pass     = ($user || $pass) ? "$pass@" : '';
    $path     = isset($parts['path']) ? $parts['path'] : '';
    $query    = isset($parts['query']) ? '?' . $parts['query'] : '';
    $fragment = isset($parts['fragment']) ? '#' . $parts['fragment'] : '';
    
    return $scheme . $user . $pass . $host . $port . $path . $query . $fragment;
}

$url = "https://example.com/api/v1/users/?page=2";
echo removeTrailingSlashFromPath($url);
// 输出: https://example.com/api/v1/users?page=2

// 场景2:保留根路径的斜杠
function smartRemoveTrailingSlash($url) {
    // 如果URL只有协议和域名,保留结尾斜杠(可选)
    if (preg_match('/^https?:\/\/[^\/]+\/?$/', $url)) {
        return $url;
    }
    
    return rtrim($url, '/');
}

注意事项

  1. rtrim() 会去除所有连续的结尾斜杠,不只是第一个

  2. 如果URL包含查询参数或锚点,要小心处理,避免误删

  3. 对于根路径(如 https://example.com/),你可能想保留斜杠

  4. 文件路径同样适用这个方法

最推荐的简单方案

// 大多数情况下,直接使用 rtrim() 就足够了
$url = "https://example.com/path/to/resource/";
$cleanUrl = rtrim($url, '/');

// 如果需要保留根路径的斜杠
if ($cleanUrl === '') {
    $cleanUrl = '/';
}

rtrim($url, '/') 是最简单、最常用的方法,能满足大多数去结尾斜杠的需求。