我需要在 PHP 中按照“ - ”拆分字符串并获取最后一部分。
因此从这个字符串:
abc-123-xyz-789
我期望得到:
"789"
这是我想出来的代码:
substr(strrchr($urlId, '-'), 1)
这个功能很好,但是:
如果我的输入字符串中不包含任何“-”,我必须获取整个字符串,例如从:
123
我需要得到:
123
而且需要尽可能快。
preg_split($pattern,$string)
函数可以根据给定的正则表达式模式来拆分字符串。explode($pattern,$string)
函数可以根据给定的模式来拆分字符串。end($arr)
函数可以获取数组的最后一个元素。因此:
$strArray = explode('-',$str)
$lastElement = end(explode('-', $strArray));
// or
$lastElement = end(preg_split('/-/', $str));
将返回由-
分隔的字符串的最后一个元素。
还有一种高级方法可以实现这个功能:
$str = '1-2-3-4-5';
echo substr($str, strrpos($str, '-') + 1);
// | '--- get the last position of '-' and add 1(if don't substr will get '-' too)
// '----- get the last piece of string after the last occurrence of '-'
array_pop
函数将删除数组中的最后一个元素并返回该元素,而 end
函数仅返回最后一个元素。我认为它们在性能方面没有区别。 - Wesley Schleumer de Góesexplode
理论上比split
更快。 - Wesley Schleumer de Góesend(explode('-',$str))
出现错误:Strict (2048): Only variables should be passed by reference
。解决方法请参考:https://dev59.com/3m445IYBdhLWcg3w6eXz。 - trante$string = 'abc-123-xyz-789';
$exploded = explode('-', $string);
echo end($exploded);
这个没有 E_STRICT 问题。
if (strpos($potentiallyDelimitedString, '-') !== FALSE) {
found delimiter, so split
}
$cases = [
'aaa-zzz' => 'zzz',
'zzz' => 'zzz',
'-zzz' => 'zzz',
'aaa-' => '',
'' => '',
'aaa-bbb-ccc-ddd-eee-fff-zzz' => 'zzz',
];
function test_substr($str, $delimiter = '-') {
$idx = strrpos($str, $delimiter);
return $idx === false ? $str : substr($str, $idx + 1);
}
function test_end_index($str, $delimiter = '-') {
$arr = explode($delimiter, $str);
return $arr[count($arr) - 1];
}
function test_end_explode($str, $delimiter = '-') {
$arr = explode($delimiter, $str);
return end($arr);
}
function test_end_preg_split($str, $pattern = '/-/') {
$arr = preg_split($pattern, $str);
return end($arr);
}
test_substr : 1.706 sec
test_end_index : 2.131 sec +0.425 sec +25%
test_end_explode : 2.199 sec +0.493 sec +29%
test_end_preg_split : 2.775 sec +1.069 sec +63%
事实证明,使用substr
和strpos
是最快的方法。请注意,在这个解决方案中,我们必须检查strpos
是否为false
,以便返回完整的字符串(适用于zzz
情况)。
array_reverse(explode('-', $str))[0]
根据这篇文章:
end((explode('-', $string)));
这将不会在PHP 5中引起E_STRICT警告(参见PHP magic)。尽管在PHP 7中会发出警告,因此在其前面添加@
可以用作解决方法。
php7
中消失了。点击链接查看有关变量处理方面的不兼容信息:http://php.net/manual/zh/migration70.incompatible.php#migration70.incompatible.variable-handling.parentheses - mpapec<?php
$string = 'abc-123-xyz-789';
$output = explode("-",$string);
echo $output[count($output)-1];
?>
正如其他人所提到的,如果你不将explode()
的结果分配给一个变量,你会得到以下消息:
E_STRICT: Strict standards: Only variables should be passed by reference
正确的方式是:
$words = explode('-', 'hello-world-123');
$id = array_pop($words); // 123
$slug = implode('-', $words); // hello-world
由于explode()
返回一个数组,如果您知道最后一个数组项的位置,可以直接在该函数的末尾添加方括号。
$email = 'name@example.com';
$provider = explode('@', $email)[1];
echo $provider; // example.com
另一种方法是使用list()
:
$email = 'name@example.com';
list($prefix, $provider) = explode('@', $email);
echo $provider; // example.com
如果您不知道位置:
$path = 'one/two/three/four';
$dirs = explode('/', $path);
$last_dir = $dirs[count($dirs) - 1];
echo $last_dir; // four
这个解决方案是空值安全的,并支持所有的PHP版本:
// https://www.php.net/manual/en/function.array-slice.php
$strLastStringToken = array_slice(explode('-',$str),-1,1)[0];
如果 $str = null
,则返回 ''
。
explode()
函数用于将一个字符串通过指定的分隔符进行分割成数组,返回包含分割后的子串的数组。end()
函数用于获取数组中的最后一个元素。 - Wrikkenend(split('-',$str))
- Wesley Schleumer de Góes