获取URL PHP的最后一部分

Bel*_*ish 54 php url

我只是想知道如何使用PHP提取URL的最后一部分.

示例网址为:

http://domain.com/artist/song/music-videos/song-title/9393903
Run Code Online (Sandbox Code Playgroud)

现在我如何使用PHP提取最终部分?

9393903
Run Code Online (Sandbox Code Playgroud)

URL中始终存在相同数量的变量,并且id始终位于末尾.

nik*_*org 101

实现这一目标的绝对最简单的方法是 basename()

echo basename('http://domain.com/artist/song/music-videos/song-title/9393903');
Run Code Online (Sandbox Code Playgroud)

哪个会打印

9393903

当然,如果最后有一个查询字符串,它将包含在返回值中,在这种情况下,接受的答案是更好的解决方案.

  • 如果你问我,最好的答案 (4认同)

hak*_*kre 91

将它拆开并获得最后一个元素:

$end = end(explode('/', $url));
# or:
$end = array_slice(explode('/', $url), -1)[0];
Run Code Online (Sandbox Code Playgroud)

编辑:要支持apache样式规范的URL,rtrim很方便:

$end = end(explode('/', rtrim($url, '/')));
# or:
$end = array_slice(explode('/', rtrim($url, '/')), -1)[0];
Run Code Online (Sandbox Code Playgroud)

可能我认为更具可读性的另一个例子是(Demo):

$path = parse_url($url, PHP_URL_PATH);
$pathFragments = explode('/', $path);
$end = end($pathFragments);
Run Code Online (Sandbox Code Playgroud)

此示例还考虑到仅处理URL的路径.


还包括另一个编辑(几年后),规范化和简单的UTF-8替代使用(通过PHP中的PCRE正则表达式):

<?php

use function call_user_func as f;
use UnexpectedValueException as e;

$url = 'http://example.com/artist/song/music-videos/song-title/9393903';

$result = preg_match('(([^/]*)/*$)', $url, $m)

    ? $m[1]
    : f(function() use ($url) {throw new e("pattern on '$url'");})
    ;

var_dump($result); # string(7) "9393903"
Run Code Online (Sandbox Code Playgroud)

这是非常粗略的,但展示了如何preg_match通过PCRE正则表达式模式调用这个以进行更细粒度的控制.添加一些感此裸机例如,应该它自己的函数(其也会使走样多余)内缠绕.为了简洁起见,这样做了.

  • @hakre +1,但是如果`$ url`中有斜杠,你就什么也得不到.最好先使用[array_filter](http://php.net/array_filter)删除空元素 - `$ pathFragments = array_filter(explode('/',$ path));` (2认同)

小智 24

您可以使用preg_match以匹配所需的URL部分.

在这种情况下,由于模式很简单,我们正在寻找正斜杠(\/我们必须转义它,因为正斜杠表示正则表达式模式的开始和结束),以及一个或多个数字(\d+)at string($)的最后一部分.围绕它的括号\d+用于捕获我们想要的那块:即结束.然后我们将我们想要的结束分配$end$matches[1](不$matches[0],因为它与$url(即整个字符串)相同).

$url='http://domain.com/artist/song/music-videos/song-title/9393903';

if(preg_match("/\/(\d+)$/",$url,$matches))
{
  $end=$matches[1];
}
else
{
  //Your URL didn't match.  This may or may not be a bad thing.
}
Run Code Online (Sandbox Code Playgroud)

注意: 您可能想要也可能不想为此正则表达式添加更复杂的内容.例如,如果您知道您的URL字符串将始终http://,则正则表达式可以变为/^http:\/\/.*\/(\d+)$/(其中.*表示零个或多个字符(不是换行符)).

  • 这个解决方案可能是最慢的一个; 不讨厌,只是说. (2认同)

Pet*_*ter 15

如果您正在寻找可以处理任何形式的URL的健壮版本,这应该做得很好:

<?php

$url = "http://foobar.com/foo/bar/1?baz=qux#fragment/foo";
$lastSegment = basename(parse_url($url, PHP_URL_PATH));
Run Code Online (Sandbox Code Playgroud)


Tam*_*ash 12

$id = strrchr($url,"/");
$id = substr($id,1,strlen($id));
Run Code Online (Sandbox Code Playgroud)

以下是该strrchr功能的描述:http://www.php.net/manual/en/function.strrchr.php

希望这很有用!


som*_*one 7

另外一个选项:

$urlarray=explode("/",$url);
$end=$urlarray[count($urlarray)-1];
Run Code Online (Sandbox Code Playgroud)


Rob*_*air 6

最优雅的解决方案之一是在 url 中的最后一个 / 之后获取字符

通过不满的山羊

$id = substr($url, strrpos($url, '/') + 1);
Run Code Online (Sandbox Code Playgroud)

strrpos 获取斜杠最后一次出现的位置;substr 返回该位置之后的所有内容。