去除重复的尾部斜杠

3

我希望能用php检测像$string这样的字符串中是否包含重复的尾随斜杠。

例如:

$string = "http://somepage.com/something/some.html/////";

to

$string = "http://somepage.com/something/some.html";

我想做一个if,如果有重复的话,就像这样:

If ($string = "http://somepage.com/something/some.html/////";) {
    remove extra trailing slashes
} 
//else do nothing... 
5个回答

9

像这样应用rtrim

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

6
你可以直接使用 rtrim() 函数:
$string = rtrim($string, '/');

如果您出于某种原因希望首先检查它是否有斜杠,则可以检查最后一个字符,如下所示:
if ($string[ strlen($string)-1 ] === '/') {
    $string = rtrim($string, '/');
}

将字符串通过rtrim()函数处理并不会影响性能,因此您不需要先检查尾部是否有斜杠。

使用正则表达式来去除尾部的斜杠可能有些过度。


如果 ($string[ strlen($string)-1 ] === '/') { $string = rtrim($string, '/'); } .. $string[ strlen($string)-1 ] 是什么意思... 为什么 $string 是一个数组?... 我不是很理解,但它看起来像是对我最好的解决方案。我有两种类型的URL...例如:http://mikrobusz-berles.com 和 http://mikrobusz-berles.com/flotta.html ... 我只想删除每个额外的斜杠...在 .html 上很容易,但当我写下以下内容时怎么办: http://mikrobusz-berles.com///////////? - János Tigyi
1
你可以使用 [] 访问字符串中的字符。rtrim($string, '/') 可以移除右侧所有斜杠。在提出更多问题之前,请查看文档 - Sverri M. Olsen

3

rtrim是最好的解决方案,但由于您标记了regex以保证完整性:

$string = "http://somepage.com/something/some.html/////";
echo preg_replace('#/+$#','',$string);

>>> http://somepage.com/something/some.html

#   - Is the delimiter character 
/+  - Matches one or more forward slash
$   - Matches the end of the string
#   - Delimiter 
Replace with 
''  - Nothing (empty string)

3

有些地方可以重复使用/,例如,你可以通过以下所有链接访问你的问题:

这里唯一起作用的双/http://,所以我们要考虑它。在我提供的大多数情况下,仅使用rtrim将无法正常工作,因此让我们使用正则表达式。

解决方法

$parts = explode('//', $full_url, 2);
$parts[1] = rtrim(preg_replace('@/+@', '/', $parts[1]), '/');
$full_url = implode('//', $parts);
unset($parts);

Live test: http://ideone.com/1qHR9o

Before: https://dev59.com/KmzXa4cB1Zd3GeqPS2GQ
After:  https://dev59.com/KmzXa4cB1Zd3GeqPS2GQ
---------------------
Before: https://dev59.com/KmzXa4cB1Zd3GeqPS2GQ///
After:  https://dev59.com/KmzXa4cB1Zd3GeqPS2GQ
---------------------
Before: https://stackoverflow.com///questions///13990256///remove-duplicate-trailing-slashes////
After:  https://dev59.com/KmzXa4cB1Zd3GeqPS2GQ
---------------------
Before: https://stackoverflow.com/questions//13990256/remove-duplicate-trailing-slashes//
After:  https://dev59.com/KmzXa4cB1Zd3GeqPS2GQ
---------------------

解释

从你的问题中我理解到你总是得到一个完整的URL,因此我们可以将其分为两个部分:

$parts = explode('//', $full_url, 2);

现在我们使用以下代码删除重复的/
preg_replace('@/+@', '/', $parts[1])

然后我们从字符串末尾移除多余的/
$parts[1] = rtrim( /*previous line*/ , '/');

然后将其合并回去:

$full_url = implode('//', $parts);
unset($parts);

我不知道,我为了补偿你而投了赞成票 :) 然而,explode部分有点棘手。我更喜欢一个排除正则表达式,它只是排除 https?:// 部分。因为,如果URL中没有定义协议,那么它将失败。 - Jelmer
@Jelmer 实际上,如果没有定义协议,那么你就没有一个URL,你有一个URI,数据将是无效的,但可以通过检查数组大小轻松测试,尽管我在接收参数时会测试它们是否有效。 - José Roberto Araújo Júnior
OP想要做的就是从字符串中删除尾部的正斜杠,而rtrim是完美的解决方案,你回答的问题是验证URL中的正斜杠。 - Chris Seymour
@sudo_O 好的,我不知道 trailing 的意思是“在右边”,我一直以为它是多个或连续的意思。那是语言障碍。 - José Roberto Araújo Júnior
@JoséRobertoAraújoJúnior 噢,好的,是的,“trailing”意味着“在末尾找到”。 - Chris Seymour
啊!爆炸/收缩。谢谢 :) 我发现我的 sanitizePath() 函数意外地也删除了http://中的双斜杠,这是一个不想要的行为。我正在寻找一个简单而短小的解决方案,然后找到了这个。太棒了 :) - Smuuf

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

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