无法获取URL的最后一部分

3

我想获取这个url字符串的最后一部分:national/italy/serie-a/20152016/s11663/

我的目标是获取:s11663,这是我的代码:

$path = parse_url("national/italy/serie-a/20152016/s11663/", PHP_URL_PATH);
$pathFragments = explode('/', $path);
$end = end($pathFragments);
var_dump($end);

但是我得到的结果是:

字符串(0) ""

我做错了什么?

在将 URL 拆分之前,您可以对其进行清理(删除开头和结尾的空格、斜杠等)。 - Kaspars Primaks
1
请看一下我的回答编辑。我添加了一个代码,可以处理以及不以“/”结尾的URL。 - FirstOne
@FirstOne,我看到你的第二个方案,但出现了这个错误:警告:substr()希望参数3为long,但给出的是字符串。相反,第一个很好用。谢谢。 - Sevengames Xoom
@SevengamesXoom,很奇怪。对我来说它是有效的https://3v4l.org/BWjkd……我会看看我能找到什么。 - FirstOne
@SevengamesXoom,请强制将参数3设置为(substr($path, -1, 1)),然后告诉我... - FirstOne
显示剩余3条评论
3个回答

5

如果你的$path字符串结尾有一个/,那么当你使用explode()函数时,最后一个/也会被计算在内,因此最后一部分内容会为空,因为最后一个/之后没有内容。所以只需要将结尾的/删除即可。

$path = parse_url("national/italy/serie-a/20152016/s11663", PHP_URL_PATH);
$pathFragments = explode('/', $path);
$end = end($pathFragments);
var_dump($end);

如果您无法移除最后一个/,那么可以使用substr函数截取字符串:

$url = "national/italy/serie-a/20152016/s11663/";
$url = substr($url, 0, strlen($url) - 1);
$path = parse_url($url, PHP_URL_PATH);
$pathFragments = explode('/', $path);
$end = end($pathFragments);
var_dump($end);

希望能对您有所帮助!
更新
在最后一个示例中,无论是哪个字符,它都会被substr截断,因此,您可以像@firstone的评论建议的那样使用,而不是$url = substr($url, 0, strlen($url) - 1);,如下:
$url = rtrim($url, "/");

或者,这个:
if($url[strlen($url) - 1] == "/") {
    $url = substr($url, 0, strlen($url) - 1);
} else {
    // Let the url be as it is.....
}

请注意,第二段代码无法正常工作:E_WARNING:类型2 - substr()期望第3个参数为long类型,但给定的是字符串类型 - FirstOne
感谢@FirstOne的提醒!已更改答案! - Ikari
@Saitama 如果我传递这个:/national/italy/serie-a/c13,将返回 c1 而不是 c13 - Sevengames Xoom
@Saitama,_以防万一_,如果URL 不是/ 结尾(就像上面的评论^中一样),您可以使用 $url = rtrim($url, '/'); 而不是 substr。这样,如果最后一个字符不是 /,它就不会被删除... - FirstOne

3
由于您在末尾加了一个斜杠/,因此您需要获取倒数第二个:
$path = parse_url("national/italy/serie-a/20152016/s11663/", PHP_URL_PATH);
$pathFragments = explode('/', $path);
array_pop($pathFragments); // remove last (empty value)
$end = end($pathFragments);
var_dump($end);

请看您问题中$pathFragments的输出结果:
Array
(
    [0] => national
    [1] => italy
    [2] => serie-a
    [3] => 20152016
    [4] => s11663
    [5] => 
)

这段代码适用于以and结尾且没有/的字符串:

$path = parse_url("national/italy/serie-a/20152016/s11663", PHP_URL_PATH);
$pathFragmenst = (substr($path, -1) == '/') ? 
    $pathFragments = explode('/', $path, -1) :
    $pathFragments = explode('/', $path);

$end = end($pathFragments);
var_dump($end);

../s11663/ 的输出结果为:https://3v4l.org/BWjkd

字符串(6) "s11663"

../s11663 的输出结果为:https://3v4l.org/H7fP9

字符串(6) "s11663"


说明:

1 - 这段代码:

$pathFragmenst = (substr($path, -1) == '/') ? 
    $pathFragments = explode('/', $path, -1) :
    $pathFragments = explode('/', $path);

缩写意思是:

if(substr($path, -1) == '/'){
    $pathFragments = explode('/', $path, -1);
}else{
    $pathFragments = explode('/', $path);
}

2 - 我不确定那个字符串是否是url_parse的结果,或者你真的在尝试解析它,但是

var_dump(parse_url("national/italy/serie-a/20152016/s11663", PHP_URL_PATH));

将输出

string(38) "national/italy/serie-a/20152016/s11663"

所以没有必要parse_url它 - 除非你正在尝试解析类似以下的内容:

http://example.com/national/italy/serie-a/20152016/s11663/
^^^^^^^^^^^^^^^^^^^

我保留了它,以防您将使用完整的url...


2
当你执行explode('/', $path);时,结果数组的最后一个元素为空,因为最后一个元素是最后一个“/”后面的部分。
要么使用建议方案之一,要么转而使用preg_match()函数:
$end = '';
$path = parse_url("national/italy/serie-a/20152016/s11663/", PHP_URL_PATH);

if(preg_match('#/([^/]+)/$#', $path, $matches)) {
  $end = $matches[1];
}

var_dump($end);

值得一提的是,自从op添加了这个评论后,如果缺少最后一个/,此答案将输出string(0) "" - FirstOne

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