在网址的最后一个/之后获取字符


Answers:


264

很简单:

$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

8
我想知道为什么$str = basename($url)没有得到更多的投票,对我来说效果很好。
redanimalwar 2015年

1
@redanimalwar(1)基本名称用于文件路径,而不用于URL-我认为它将始终返回相同的结果,但是可能会出现反斜杠之类的情况;(2)basename仅适用于斜杠,而如果其他人想用不同的字符来做同样的事情,我的答案就很容易修改。
DisgruntledGoat 2015年

谢谢。简单实用!
Rodrigo Zuluaga


14

您可以基于“ /” 爆炸,并返回最后一个条目:

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)

可能会慢一些,但我更喜欢在这里爆炸。具体来说,如果url不包含任何“ /”,则strrpos答案中的+1可以使混乱得以克服。
2014年

1
该示例发出通知,并且必须明确地进行重做。
Xatenev '16

是的,爆炸数据必须是变量
ymakux

11

您可以使用substrstrrchr

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

像这样:ltrim(strrchr($ url,“ /”),“ /”); strchr返回字符串,而不是数字
Denis Chenu 2015年

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

3
我的版本,尽管最终结果与发布的结果相同,但如果OP希望,OP可以使用拆分字符串的其他项目。
ghostdog74

这是正确的答案,因为标题在“ last” / url之后询问
Fabiano Shark

1

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


在php7中返回通知:PHP Notice: Only variables should be passed by reference
billynoah

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,end()在php 5.4+及更高版本中使用此方式将引发通知。根据docs:“ 您必须传递给它一个实变量而不是一个返回数组的函数,因为只有实际的变量可以通过引用传递。
比利诺亚

-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;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.