Строка в массив, разделенная новыми строками и скобками - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть большой строковый блок, который мне нужно разбить на массивы, если они заключены в скобки или разделены новыми строками.

Ввод:

[this is block
this is also same "block"
this is same block

another same block]
new block!
another new block!
[this is new block
this is also a new block]

Один измного вещей, которые я пробовал:

$block_lines = preg_split('/\[([^]]+)\]|\r/', $block_content);

Ожидаемый результат:

Array
(
  [0] => 'this is block
  this is also same "block"
  this is same block

  another same block'
  [1] => 'new block!'
  [2] => 'another new block!'
  [3] => 'this is new block
  this is also a new block'
)

Фактический результат:

Array
(
  [0] => 'new block!'
  [1] => 'another new block!'
  [2] => ''
)

Ответы [ 3 ]

0 голосов
/ 21 декабря 2018

Вы можете использовать это регулярное выражение в preg_split:

/\[([^]]+)]|\R/

. Оно разбивает строку либо на строку символов внутри [ и ], либо на новую строку.Используя флаг PREG_SPLIT_DELIM_CAPTURE, мы можем также захватить содержимое []:

$string = '[this is block
this is also same "block"
this is same block

another same block]
new block!
another new block!
[this is new block
this is also a new block]';
print_r(preg_split('/\[([^]]+)]|\R/', $string, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE));

Вывод:

Array ( 
    [0] => this is block 
this is also same "block" 
this is same block

another same block
    [1] => new block!
    [2] => another new block!
    [3] => this is new block
this is also a new block
)

Демонстрация на 3v4l.org

0 голосов
/ 21 декабря 2018

В качестве альтернативы, чтобы изменить формулировку вашей логики, вы хотите взорваться на всех символах новой строки, которые не находятся внутри выражения в квадратных скобках.Вы можете использовать (*SKIP)(*FAIL) для сопоставления и игнорирования заключенных в скобки выражений, а также для разнесения по всем символам новой строки, которые проходят через фильтр.

Код: ( Demo )

var_export(preg_split('~\[[^\]]*](*SKIP)(*FAIL)|\R~', $text));

Вывод:

array (
  0 => '[this is block
this is also same "block"
this is same block

another same block]',
  1 => 'new block!',
  2 => 'another new block!',
  3 => '[this is new block
this is also a new block]',
)
0 голосов
/ 21 декабря 2018

Сначала сопоставьте все квадратные скобки (которые могут содержать новые строки), в противном случае - одну строку.

Причина, по которой я предпочитаю preg_match_all() над preg_split() для этого случая, заключается в том, что в простых терминахВы на самом деле не собираетесь выполнять динамические взрывы, но чтобы найти совпадения.

Код: ( Демо )

$text = '[this is block
this is also same "block"
this is same block

another same block]
new block!
another new block!
[this is new block
this is also a new block]';

var_export(preg_match_all('~\[[^\]]*]|.+~', $text, $matches) ? $matches[0] : 'nothing');

Выход:

array (
  0 => '[this is block
this is also same "block"
this is same block

another same block]',
  1 => 'new block!',
  2 => 'another new block!',
  3 => '[this is new block
this is also a new block]',
)
...