【发布时间】:2011-11-15 17:45:58
【问题描述】:
我只是想知道如何使用 PHP 提取 URL 的最后一部分。
示例网址为:
http://domain.com/artist/song/music-videos/song-title/9393903
现在如何使用 PHP 提取最终部分?
9393903
URL中的变量个数总是一样的,id总是在最后。
【问题讨论】:
我只是想知道如何使用 PHP 提取 URL 的最后一部分。
示例网址为:
http://domain.com/artist/song/music-videos/song-title/9393903
现在如何使用 PHP 提取最终部分?
9393903
URL中的变量个数总是一样的,id总是在最后。
【问题讨论】:
最简单的方法是使用basename()
echo basename('http://domain.com/artist/song/music-videos/song-title/9393903');
哪个会打印
9393903
当然,如果末尾有查询字符串,它会包含在返回值中,在这种情况下接受的答案是更好的解决方案。
【讨论】:
拆分出来,得到最后一个元素:
$end = end(explode('/', $url));
# or:
$end = array_slice(explode('/', $url), -1)[0];
编辑:为了支持 apache-style-canonical URL,rtrim 很方便:
$end = end(explode('/', rtrim($url, '/')));
# or:
$end = array_slice(explode('/', rtrim($url, '/')), -1)[0];
另一个我认为更易读的例子是 (Demo):
$path = parse_url($url, PHP_URL_PATH);
$pathFragments = explode('/', $path);
$end = end($pathFragments);
这个例子还考虑到只对 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"
这很粗略,但展示了如何将其包装在 preg_match 调用中,以通过 PCRE 正则表达式模式进行更细粒度的控制。为了给这个裸机示例增加一些意义,它应该被包装在它自己的函数中(这也会使别名变得多余)。为简洁起见,仅以这种方式呈现。
【讨论】:
$url 中有斜杠,您将一无所获。最好先使用array_filter 删除空元素——$pathFragments = array_filter(explode('/', $path));
rtrim-boogie,我编辑了答案,请看现在的第三个代码示例。
basename/str* 解决方案和preg 解决方案之间。虽然这是一种直观简单的方法,但它会带来一些运行时开销。
您可以使用preg_match 来匹配您想要的URL 部分。
在这种情况下,由于模式很简单,我们正在寻找一个正斜杠(\/,我们必须转义它,因为正斜杠表示正则表达式模式的开始和结束),以及一个或多个数字 (\d+) 在字符串的最后 ($)。 \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.
}
注意:您可能希望也可能不希望向此正则表达式添加一些更复杂的功能。例如,如果您知道您的 URL 字符串将始终以 http:// 开头,那么正则表达式可以变为 /^http:\/\/.*\/(\d+)$/(其中 .* 表示零个或多个字符(不是换行符) ))。
【讨论】:
如果您正在寻找可以处理任何形式的URLs 的强大版本,这应该会很好:
<?php
$url = "http://foobar.com/foo/bar/1?baz=qux#fragment/foo";
$lastSegment = basename(parse_url($url, PHP_URL_PATH));
【讨论】:
$id = strrchr($url,"/");
$id = substr($id,1,strlen($id));
这里是strrchr函数的描述:http://www.php.net/manual/en/function.strrchr.php
希望有用!
【讨论】:
basename() 解决方案。
另一种选择:
$urlarray=explode("/",$url);
$end=$urlarray[count($urlarray)-1];
【讨论】:
这里是最优雅的解决方案之一Get characters after last / in url
来自不满的山羊
$id = substr($url, strrpos($url, '/') + 1);
strrpos 获取斜线最后出现的位置;子串 返回该位置之后的所有内容。
【讨论】:
一个班轮:$page_path = end(explode('/', trim($_SERVER['REQUEST_URI'], '/')));
获取 URI,修剪斜线,转换为数组,抓取最后一部分
【讨论】:
故障安全解决方案是:
引用自https://stackoverflow.com/a/2273328/2062851
function getLastPathSegment($url) {
$path = parse_url($url, PHP_URL_PATH); // to get the path from a whole URL
$pathTrimmed = trim($path, '/'); // normalise with no leading or trailing slash
$pathTokens = explode('/', $pathTrimmed); // get segments delimited by a slash
if (substr($path, -1) !== '/') {
array_pop($pathTokens);
}
return end($pathTokens); // get the last segment
}
echo getLastPathSegment($_SERVER['REQUEST_URI']); //9393903
【讨论】:
这将轻松完成所需 URL 的最后一部分
$url="http://domain.com/artist/song/music-videos/song-title/9393903";
$requred_string= substr(strrchr($url, "/"), 1);
这将在右侧第一个“/”之后为您提供字符串。
【讨论】:
$mylink = $_SERVER['PHP_SELF'];
$link_array = explode('/',$mylink);
echo $lastpart = end($link_array);
【讨论】:
function getLastPathSegment($url) {
$arr = explode('/', $url);
return $arr[count($arr) - 1];
}
【讨论】:
1-liner
$end = preg_replace( '%^(.+)/%', '', $url );
// if( ! $end ) no match.
这只是删除最后一个斜杠之前的所有内容,包括它。
【讨论】:
一条线的工作答案:
$url = "http://www.yoursite/one/two/three/drink";
echo $end = end((explode('/', $url)));
输出:喝
【讨论】: