57

我需要在 PHP 中用“-”分割一个字符串并得到最后一部分。

所以从这里:

abc-123-xyz-789

我希望得到

“789”

这是我想出的代码:

substr(strrchr($urlId, '-'), 1)

效果很好,除了:

如果我的输入字符串不包含任何“-”,我必须获取整个字符串,例如:

123

我需要回去

123

它需要尽可能快。

4

14 回答 14

137
  • split($pattern,$string)在给定的模式或正则表达式中拆分字符串(自 5.3.0 起已弃用)
  • preg_split($pattern,$string)在给定的正则表达式模式中拆分字符串
  • explode($pattern,$string)在给定模式中拆分字符串
  • end($arr)获取最后一个数组元素

所以:

end(split('-',$str))

end(preg_split('/-/',$str))

$strArray = explode('-',$str)
$lastElement = end($strArray)

将返回-分隔字符串的最后一个元素。


有一种硬核方法可以做到这一点:

$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 '-'
于 2013-06-10T18:56:29.137 回答
26
$string = 'abc-123-xyz-789';
$exploded = explode('-', $string);
echo end($exploded);

这没有 E_STRICT 问题。

于 2013-06-10T18:55:12.663 回答
7

只需检查分隔符是否存在,然后拆分或不:

if (strpos($potentiallyDelimitedString, '-') !== FALSE) {
  found delimiter, so split
}
于 2013-06-10T18:53:45.877 回答
4

为了满足“它需要尽可能快”的要求,我针对一些可能的解决方案进行了基准测试。每个解决方案都必须满足这组测试用例。

$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);
}

以下是每个解决方案针对测试用例运行 1,000,000 次后的结果:

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%

事实证明,其中最快的是使用substrwith strpos。请注意,在此解决方案中,我们必须检查strpos以便false我们可以返回完整的字符串(迎合这种zzz情况)。

于 2018-05-31T01:14:58.787 回答
2

This code will do that

<?php
$string = 'abc-123-xyz-789';
$output = explode("-",$string);
echo $output[count($output)-1];
?>
于 2013-06-10T19:18:28.943 回答
2

根据这篇文章

end((explode('-', $string)));

这不会在 PHP 5 ( PHP magic )中引起E_STRICT警告。虽然警告将在 PHP 7 中发出,所以在它前面添加可以作为一种解决方法。@

于 2015-11-14T00:25:10.827 回答
2

正如其他人所提到的,如果您不将结果分配给explode()变量,则会收到以下消息:

E_STRICT:严格标准:只有变量应该通过引用传递

正确的方法是:

$words = explode('-', 'hello-world-123');
$id = array_pop($words); // 123
$slug = implode('-', $words); // hello-world
于 2016-06-03T18:39:55.563 回答
0

由于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
于 2015-06-15T15:43:09.600 回答
0

此解决方案是 null 安全的,并支持所有 PHP 版本:

// https://www.php.net/manual/en/function.array-slice.php
$strLastStringToken = array_slice(explode('-',$str),-1,1)[0];

''如果返回$str = null

于 2021-11-24T10:17:19.497 回答
0

接受的答案中有一个错误,如果找不到分隔符,它仍然会吃掉输入字符串的第一个字符。

$str = '1-2-3-4-5';
echo substr($str, strrpos($str, '-') + 1);

产生预期的结果:5

$str = '1-2-3-4-5';
echo substr($str, strrpos($str, ';') + 1);

生产-2-3-4-5

$str = '1-2-3-4-5';
if (($pos = strrpos($str, ';')) !== false)
    echo substr($str, $pos + 1);
else
    echo $str;

根据需要生成整个字符串。

3v4l链接

于 2020-11-08T12:15:40.120 回答
0

只需调用以下单行代码:

 $expectedString = end(explode('-', $orignalString));
于 2020-07-29T05:04:11.653 回答
-1

您可以将array_popexplode结合使用

代码:

$string = 'abc-123-xyz-789';
$output = array_pop(explode("-",$string));
echo $output;

演示点击这里

于 2013-06-10T18:57:58.080 回答
-1

你可以这样做:

$str = "abc-123-xyz-789";
$last = array_pop( explode('-', $str) );
echo $last; //echoes 789
于 2013-06-10T18:55:05.800 回答
-1

你可以这样做:

$str = "abc-123-xyz-789";
$arr = explode('-', $str);
$last = array_pop( $arr );
echo $last; //echoes 789
于 2018-08-03T20:03:54.837 回答