我需要在PHP中用“ - ”拆分一个字符串并获取最后一部分。
所以从这个:
ABC-123-XYZ-789
我希望得到
“789”
这是我提出的代码:
substr(strrchr($urlId, '-'), 1)
工作正常,除了:
如果我的输入字符串不包含任何“ - ”,我必须得到整个字符串,例如:
123
我需要回来
123
它需要尽可能快。 任何帮助表示赞赏!
答案 0 :(得分:97)
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 '-'
答案 1 :(得分:18)
$string = 'abc-123-xyz-789';
$exploded = explode('-', $string);
echo end($exploded);
编辑::最后解决了删除E_STRICT问题
答案 2 :(得分:7)
只需检查分隔字符是否存在,或者分割或不分割:
if (strpos($potentiallyDelimitedString, '-') !== FALSE) {
found delimiter, so split
}
答案 3 :(得分:2)
此代码将执行此操作
<?php
$string = 'abc-123-xyz-789';
$output = explode("-",$string);
echo $output[count($output)-1];
?>
答案 4 :(得分:2)
正如其他人所提到的,如果您不将explode()
的结果分配给变量,则会收到以下消息:
E_STRICT:严格的标准:只应通过引用传递变量
正确的方法是:
$words = explode('-', 'hello-world-123');
$id = array_pop($words); // 123
$slug = implode('-', $words); // hello-world
答案 5 :(得分: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
答案 6 :(得分:0)
根据this post:
@
在PHP 5(PHP magic)中不会导致 E_STRICT 警告。虽然the warning will be issued in PHP 7,但在其前面添加np.corrcoef
可用作解决方法。
答案 7 :(得分:0)
为了满足“它需要尽可能快”的要求我针对一些可能的解决方案运行了基准测试。每个解决方案都必须满足这组测试用例。
$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%
事实证明,最快的是substr
使用strpos
。请注意,在此解决方案中,我们必须检查strpos
false
,以便我们返回完整字符串(符合zzz
情况)。
答案 8 :(得分: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;
根据需要产生整个字符串。
答案 9 :(得分:-1)
您可以将 array_pop 与爆炸结合使用
代码:
$string = 'abc-123-xyz-789';
$output = array_pop(explode("-",$string));
echo $output;
DEMO :Click here
答案 10 :(得分:-1)
您可以这样做:
$str = "abc-123-xyz-789";
$arr = explode('-', $str);
$last = array_pop( $arr );
echo $last; //echoes 789
答案 11 :(得分:-1)
只需调用以下单行代码:
$expectedString = end(explode('-', $orignalString));
答案 12 :(得分:-2)
你可以这样做:
$str = "abc-123-xyz-789";
$last = array_pop( explode('-', $str) );
echo $last; //echoes 789