$split_point = ' - ';
$string = 'this is my - string - and more';
如何使用$ split_point的第二个实例而不是第一个实例进行拆分。我能以某种方式指定从右到左的搜索吗?最简单的方法?
基本上我如何从右到左爆炸。我想拿起“ - ”的最后一个例子。
我需要的结果:
$item[0]='this is my - string'; $item[1]='and more';
而不是:
$item[0]='this is my'; $item[1]='string - and more';
答案 0 :(得分:27)
您可以使用strrev来反转字符串,然后反转结果:
$split_point = ' - ';
$string = 'this is my - string - and more';
$result = array_map('strrev', explode($split_point, strrev($string)));
不确定这是否是最佳解决方案。
答案 1 :(得分:12)
这个怎么样:
$parts = explode($split_point, $string);
$last = array_pop($parts);
$item = array(implode($split_point, $parts), $last);
不会赢得任何高尔夫奖项,但它表明意图并且运作良好,我认为。
答案 2 :(得分:6)
以下是另一种方法:
$split_point = ' - ';
$string = 'this is my - string - and more';
$stringpos = strrpos($string, $split_point, -1);
$finalstr = substr($string,0,$stringpos);
答案 3 :(得分:4)
如果我理解正确,你想要示例案例给你('这是我的 - 字符串','和更多')?
内置分割/爆炸似乎只是向前 - 你可能必须自己用strrpos实现它。 (左右搜索)
$idx = strrpos($string, $split_point);
$parts = array(substr($string, 0, $idx), substr($string, $idx+strlen($split_point)))
答案 4 :(得分:2)
为什么不拆分' - ',然后加入你一起回来的前两个数组条目?
答案 5 :(得分:1)
我偶然发现了同样的情况,并修复了它:
$split_point = ' - ';
$string = 'this is my - string - and more';
$reverse_explode = array_reverse(explode($split_point, $string));
答案 6 :(得分:1)
我喜欢Moff的回答,但我通过将元素数量限制为2并重新反转数组来改进它:
$split_point = ' - ';
$string = 'this is my - string - and more';
$result = array_reverse(array_map('strrev', explode($split_point, strrev($string),2)));
然后$ result将是:
Array ( [0] => this is my - string [1] => and more )
答案 7 :(得分:1)
这是我的 - 字符串 - 更多
<强>代码强>
$arrSpits=explode("", "this is my - string - and more");
$arrSize=count($arrSpits);
echo "Last string".$arrSpits[arrSize-1];//Output: and more
array_pop(arrSpits); //now pop the last element from array
$firstString=implode("-", arrSpits);
echo "First String".firstString; //Output: this is my - string
答案 8 :(得分:0)
假设您只想忽略第一次出现的$ split_point,这应该适合您:
# retrieve first $split_point position
$first = strpos($string, $split_point);
# retrieve second $split_point positon
$second = strpos($string, $split_point, $first+strlen($split_point));
# extract from the second $split_point onwards (with $split_point)
$substr = substr($string, $second);
# explode $substr, first element should be empty
$array = explode($split_point, $substr);
# set first element as beginning of string to the second $split_point
$array[0] = substr_replace($string, '', strpos($string, $substr));
这将允许您在第二次出现$ split_point之后(包括)拆分每次出现的$ split_point。
答案 9 :(得分:0)
$split_point = ' - ';
$string = 'this is my - string - and more';
$result = end(explode($split_point, $string));
这很好用
答案 10 :(得分:0)
一个想法:
function explode_reversed($delim,$s){
$result = array();
$w = "";
$l = 0;
for ($i = strlen($s)-1; $i>=0; $i-- ):
if ( $s[$i] == "$delim" ):
$l++;
$w = "";
else:
$w = $s[$i].$w;
endif;
$result[$l] = $w;
endfor;
return $result;
}
$arr = explode_reversed(" ","Hello! My name is John.");
print_r($arr);
结果:
Array
(
[0] => John.
[1] => is
[2] => name
[3] => My
[4] => Hello!
)
但是这要慢得多,然后爆炸。测试完成:
$start_time = microtime(true);
for ($i=0; $i<1000;$i++)
$arr = explode_reversed(" ","Hello! My name is John.");
$time_elapsed_secs = microtime(true) - $start_time;
echo "time: $time_elapsed_secs s<br>";
需要0.0625-0.078125s
但是
for ($i=0; $i<1000;$i++)
$arr = explode(" ","Hello! My name is John.");
仅需0.015625s
最快的解决方案似乎是:
array_reverse(explode($your_delimiter, $your_string));
在1000次循环中,这是我可以获得0.03125s的最佳时间。
答案 11 :(得分:0)
不知道为什么没有人发布支持 $limit
的工作函数,尽管这里是为那些知道他们会经常使用它的人准备的:
<?php
function explode_right($boundary, $string, $limit)
{
return array_reverse(array_map('strrev', explode(strrev($boundary), strrev($string), $limit)));
}
$string = 'apple1orange1banana1cupuacu1cherimoya1mangosteen1durian';
echo $string.'<br /><pre>'.print_r(explode_right(1, $string, 3),1).'</pre>';
?>
答案 12 :(得分:0)
我对所有过度设计的答案都不知所措,这些答案调用了许多函数和/或多次迭代数据。所有这些字符串和数组反转函数都使该技术非常难以理解。
在这种情况下,正则表达式非常优雅。这正是我在专业应用程序中的做法:
代码:(Demo)
$string = 'this is my - string - and more';
var_export(preg_split('~.*\K - ~', $string));
输出:
array (
0 => 'this is my - string',
1 => 'and more',
)
通过贪婪匹配字符(.*
),然后重新开始全串匹配(\K
),然后匹配最后出现的分隔子串(“-”),你保证只分隔最后的子串来自字符串。