2012-07-02 3 views
1

Что я хочу сделать, это взять строку и разделить ее на более мелкие разделы. Входные строки имеют фиксированную структуру:Разделение строки в разделах

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

То, что я хотел бы сделать, это создать подстроку каждый раз, когда я найти кронштейн или «;», то есть:

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

РНР код Я написал до сих пор не всегда хорошо, а это значит, что иногда я получаю что-то вроде {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

Я не уверен, что полный код , но я ожидал бы, что несколько вызовов «взорваться» и, возможно, «разбить» могут выполнить эту работу. – Chris

+0

@Chris Спасибо за комментарий, который мог бы также работать. Я думаю, – user1301428

ответ

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

Он разбивает $source разделителем, определяемым регулярным выражением: то есть одним из следующих:

  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); 
Смежные вопросы