Вот подход, который, я считаю, даже чище, чем вы просили:
Код: ( PHP Demo ) ( Pattern Demo )
$str = 'Hello world [something here]{optional}{optional}{optional}{n possibilities of this}';
var_export(preg_split('/ *\[|\]|(?=\{)/',$str,NULL,PREG_SPLIT_NO_EMPTY));
Выход:
array (
0 => 'Hello world',
1 => 'something here',
2 => '{optional}',
3 => '{optional}',
4 => '{optional}',
5 => '{n possibilities of this}',
)
preg_split()
будет разрывать вашу строку в трех возможных случаях (удаление этих случаев в процессе):
*\[
означает ноль или более пробелов, за которыми следует открывающая квадратная скобка.
\]
означает закрывающую квадратную скобку.
?=\{)
означает символ нулевой длины (позиция перед ...) открывающей фигурной скобкой.
* Мой шаблон генерирует пустой элемент между ]
и {
. Чтобы устранить этот бесполезный элемент, я добавил флаг PREG_SPLIT_NO_EMPTY
к вызову функции.