在URL中获取最后一个斜杠后面的字符

154

我想获取网址中最后一个斜杠后面的字符,例如http://www.vimeo.com/1234567

我该如何用php实现?


你可能会发现s($str)->afterLast('/')很有用,这是在这个独立库中找到的。 - caw
10个回答

319
非常简单:
$id = substr($url, strrpos($url, '/') + 1);

strrpos函数用于获取最后一个斜杠的位置;substr函数返回该位置之后的所有字符。


如redanimalwar所述,如果没有找到斜杠,这种方法无法正确工作,因为strrpos函数会返回false。以下是更健壮的版本:

$pos = strrpos($url, '/');
$id = $pos === false ? $url : substr($url, $pos + 1);

如果没有斜杠,这将切掉第一个字符。 - redanimalwar
@redanimalwar 我添加了另一个解决方案。 - DisgruntledGoat
11
我想知道为什么 $str = basename($url) 没有得到更多的赞,对我来说完全正常。 - redanimalwar
3
(1) basename主要用于文件路径而非URL,我认为它会始终返回相同的结果,但可能存在一些特殊情况,如反斜杠;(2)basename只适用于斜线,而我的答案可以很容易地修改,如果其他人想使用不同的字符完成相同的操作。 - DisgruntledGoat
谢谢。简单实用!! - Rodrigo Zuluaga

66

请查看basename()。它应该像这样工作:

$string = basename($url);

2
这个适用于URL吗?basename不是用于文件路径的吗? - random_user_name
3
看起来运行良好,它是一个字符串函数,它不检查路径是否存在。 - Gifford N.
如果您在 URL 以外的字符串上使用此函数,请小心,例如类名(__ CLASS __)。basename() 在 Windows 上可正常工作,因为 DIRECTORY_SEPARATOR 是反斜杠,但在 Linux 上,basename() 仅查找斜杠,因此 basename('App\Class')将在 Windows 上返回“Class”,但在 Linux 上返回“App\Class”。 - Select0r

13
你可以根据"/"进行分割,并返回最后一个条目。
print end( explode( "/", "http://www.vimeo.com/1234567" ) );

这是基于将字符串分开的方法,如果你知道字符串本身的模式不会很快改变,那么这并不是必要的。你也可以使用正则表达式来定位字符串末尾的值。
$url = "http://www.vimeo.com/1234567";

if ( preg_match( "/\d+$/", $url, $matches ) ) {
    print $matches[0];
}

“explode” 对我来说总是感觉有点多余,虽然我从未计时过它的速度。 - DisgruntledGoat
看起来 explode() 比较慢。在 10k 实例中,substr() 先执行:0.013657/0.045038。 - Sampson
可能会慢一些,但我更喜欢使用explode。特别是如果URL不包含任何“/”,strrpos答案中的+1会使explode出现问题,而explode能够克服这个问题。 - Noam
2
这个例子会抛出一个通知,应该重新修改。 - Xatenev
1
是的,展开的数据必须是一个变量。 - ymakux

12

您可以使用 substrstrrchr

$url = 'http://www.vimeo.com/1234567';
$str = substr(strrchr($url, '/'), 1);
echo $str;      // Output: 1234567

更像这样:ltrim(strrchr($url,"/"),"/"); strchr 返回一个字符串,而不是一个数字。 - Denis Chenu

10
$str = "http://www.vimeo.com/1234567";
$s = explode("/",$str);
print end($s);

3
我的版本虽然最终结果与发布的版本相同,但如果需要的话,它可以使OP使用字符串的其他部分。 - ghostdog74
这是正确的答案,因为标题要求“最后”/在URL中。 - Fabiano Shark

1

array_pop(explode("/", "http://vimeo.com/1234567")); 将返回示例 URL 的最后一个元素


在PHP7中返回通知:PHP Notice: Only variables should be passed by reference - But those new buttons though..

1

0
两个一行代码 - 我猜第一个更快,但第二个更漂亮,不像end()array_pop(),你可以直接将函数的结果传递给current(),而不会生成任何通知或警告,因为它不移动指针或改变数组。
$var = 'http://www.vimeo.com/1234567';

// VERSION 1 - one liner simmilar to DisgruntledGoat's answer above
echo substr($a,(strrpos($var,'/') !== false ? strrpos($var,'/') + 1 : 0));

// VERSION 2 - explode, reverse the array, get the first index.
echo current(array_reverse(explode('/',$var)));

@redburn,在php 5.4及以上版本中使用end()这种方式会抛出一个提示。根据文档:“你必须传递一个真正的变量而不是返回数组的函数,因为只有实际变量可以通过引用传递”。 - But those new buttons though..

0

-1

这是我写的一个漂亮的动态函数,用于删除URL或路径的最后一部分。

/**
 * remove the last directories
 *
 * @param $path the path
 * @param $level number of directories to remove
 *
 * @return string
 */
private function removeLastDir($path, $level)
{
    if(is_int($level) && $level > 0){
        $path = preg_replace('#\/[^/]*$#', '', $path);
        return $this->removeLastDir($path, (int) $level - 1);
    }
    return $path;
}

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