划分一个字符串

问题描述:

我想要做的是取一个字符串并将其分成较小的部分。输入字符串有一个固定的结构:划分一个字符串

{something here}loremipsum;loremipsum2;{something else here} ... 

我想什么做的是每次我找到一个支架或时间创建子“;”,即:

{ something here } 
lorem ipsum 
lorem ipsum 2 
{ something else here } 

的PHP代码到目前为止我写的东西并不总是很好,这意味着有时候我会得到像{something here}loremipsum这样的一个单独的部分,当它分成两部分时。

public function divide() { 
    $item = ""; 
    $splitted_instructions = str_split($this->instructions); 
    for($i=0; $i<count($splitted_instructions); $i++) { 
     if ($splitted_instructions[$i] == "{") { 
      while ($splitted_instructions[$i+1] != "}") { 
       $i++; 
       $item .= $splitted_instructions[$i]; 
      } 
      $item = "{" . $item . "}"; 
      $items[] = $item; 
      $item = ""; 
     } else { 
      while ($splitted_instructions[$i+1] != ";" && $i<count($splitted_instructions)) { 
       $i++; 
       $item .= $splitted_instructions[$i]; 
      } 
      $items[] = $item; 
      $item = ""; 
     } 
    } 
    print_r($items); 
} 

当然,如果有更好的方式来做到这一点,请让我知道:)

+1

我不知道的全部代码,但我期望多次调用'explode'和可能'implode'可以完成这项工作。 – Chris

+0

@Chris感谢您的评论,这也可以工作,我认为 – user1301428

$parts = preg_split("/((?<=\\})|\\;|(?=\\{))/", $source, -1, PREG_SPLIT_NO_EMPTY); 

它拆分由正则表达式定义的分隔符:

  1. 它由}字符前面光标位置
  2. ;字符
  3. 随后是一个{字符光标位置

Working DEMO

+0

+1整洁清晰的解决方案 – diEcho

+0

这是对这个“固定结构”做出一些假设,例如,在';'之间不能有'}。 '部分...但总的来说,比我的更好的解决方案。 :) – deceze

+0

@deceze没有这样的假设,问题没有被很好地定义。例如,没有这样的假设,我们不清楚应该如何分割例如这个字符串:'a; {b; c}; d'; '['a','{b','c}','d']'和'['a','b; c','d']'似乎同样适合于答案。 – penartur

正则表达式的简单应用:

$string = preg_replace('/({.*?})(.*?);(.*?);({.*?})/', "\\1\n\\2\n\\3\n\\4\n", $string);