регулярное выражение preg_match | preg_match_all в php - PullRequest
0 голосов
/ 03 мая 2010

Я пытаюсь найти регулярное выражение, которое создает массив, похожий на приведенный ниже, из следующей строки

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

0 голосов
/ 26 октября 2017

Вот подход, который, я считаю, даже чище, чем вы просили:

Код: ( 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 к вызову функции.

0 голосов
/ 04 мая 2010

Я думаю, вам понадобятся два шага для этого.

  1. (.+)\[(.+)\](.+) даст вам Hello world, something here и {optional}...{optional}.

  2. Применение \{(.+?)\} к последнему элементу из предыдущего шага даст вам необязательные параметры.

...