Регулярное выражение preg_match|preg_match_all в php
Я пытаюсь придумать регулярное выражение, которое создает массив, похожий на приведенный ниже, из следующей строки
$str = 'Hello world [something here]{optional}{optional}{optional}{n possibilities of this}';
Пока у меня есть /^(\*{0,3})(.+)\[(.*)\]((?:{[a-z ]+})?)$/
Array
(
[0] => Array
(
[0] => Hello world [something here]{optional}{optional}{optional}{n possibilities of this}
[1] =>
[2] => Hello world
[3] => something here
[4] => {optional}
[5] => {optional}
[6] => {optional}
[7] => ...
[8] => ...
[9] => {n of this}
)
)
Что было бы хорошим подходом для этого? Спасибо
2 ответа
Вот подход, который я считаю даже чище, чем вы просили:
Код: ( PHP 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
флаг вызова функции.
Я думаю, вам понадобится два шага для этого.
(.+)\[(.+)\](.+)
получу тебяHello world
,something here
, а также{optional}...{optional}
,применение
\{(.+?)\}
до последнего элемента из предыдущего шага вы получите необязательные параметры.