2012-07-02 116 views
1

我想要做的是取一個字符串並將其分成較小的部分。輸入字符串有一個固定的結構:劃分一個字符串

{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

回答

4
$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

1

正則表達式的簡單應用:

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