如何从右到左爆炸弦?

时间:2009-04-04 16:18:33

标签: php string

$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';

13 个答案:

答案 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)

这是我的 - 字符串 - 更多

  1. 使用常见爆炸功能获取所有字符串
  2. 获取sizeof数组并获取最后一项
  3. 使用 array_pop 函数弹出最后一项。
  4. 使用相同的分隔符内爆剩余字符串(如果您希望其他分隔符可以使用)。
  5. <强>代码

    $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),然后匹配最后出现的分隔子串(“-”),你保证只分隔最后的子串来自字符串。