Захватите все символы внутри {…}, если они не содержат & quot; {& quot; и & quot;} & quot;

Я хочу поймать всех персонажей внутри { ... },

Если внутри не найдено{» а также «}«

Так, например:

{amdnia91(\+wowa}

Лови.

{amdn{ia91(\+wowa}

Не поймать{«).

preg_match_all('#(.+?)\{(.+?)\}#', $input, $output);

Как это исправить?

РЕДАКТИРОВАТЬ.
Объяснил больше:

Я постараюсь создать css minifier.
Но там мне нужно поймать все имена и содержимое в скобках как отдельное значение массива.

Curret $ input выглядит так:

.something{property:value;prop2:value}#something2{someprop:val;prop:val}

Это также минифицировано, поэтому содержит несколько … {} … {} встроенных.
И мой код ловит все хорошо, но …
Этот улов также, если внутри скобок его скобки,
но я не хочу ловить это, если внутри скобки.

2

Решение

[^}{] означает соответствовать любому символу, который не является} или {.

Так:

preg_match_all('#\{([^}{]+)\}#', $input, $output);

Тем не менее, обратите внимание, что в вашем {amdn{ia91(+wowa} пример, это будут соответствовать ia91(+wowa фрагмент.

РЕДАКТИРОВАТЬ

Если вы не хотели совпадения для второго примера, попробуйте следующее:

preg_match_all('#^[^}{]*\{([^}{]+)\}[^}{]*$#', $input, $output);

Выражение регулярного выражения означает:

  • ^ — начало линии
  • [^}{]* — Любой символ, который не {или} ноль или более раз
  • \{ — буквальный {характер
  • ([^}{]+) — Захват одного или нескольких символов, которые не являются {или}
  • \} — буквальный символ
  • [^}{]* — Любой символ, который не {или} ноль или более раз
  • $ — конец строки

демонстрация

Второй Править

Учитывая ваше дальнейшее объяснение того, что вам нужно, я бы предложил это:

preg_match_all('#(?<=^|})[^}{]*?\{([^}{]+?)\}(?=[^}]*$|[^}]*\{)#', $input, $output);

Это использует «оглядываться назад» и «заглядывать вперед». Сломанный, это означает:

  • (?<=^|}) Lookbehind: утверждают, что это либо начало строки, либо предыдущий символ был литералом ‘}’ но не включайте этого персонажа как часть всего матча
  • [^}{]*? — лениво сопоставлять ноль или более символов, которые не являются {или}
  • \{ — буквально {
  • ([^}{]+?) — Ленивый захват одного или нескольких символов, которые не являются {или}
  • \} — буквальный}
  • (?=[^}]*$|[^}]*\{) — Lookahead: убедитесь, что следующие символы — это ноль или более символов, за которыми не}, после которых следует конец строки, или ноль или более символов, за которыми не следует}, за которыми следует литерал { но не включайте эти символы как часть всего матча

демонстрация

3

Другие решения

Я публикую альтернативу регулярному выражению, опубликованному daiscog, на основе концепции сопоставления того, что нам не нужно, и исключения из нее, и сопоставления того, что нам нужно позже, с помощью PCRE. (*SKIP)(*FAIL) глаголы:

[#.]?[^{}]*{[^{}]*[{}][^{}]*}(*SKIP)(*F)|[#.]?[^{}]*{([^{}]+)}

Увидеть regex demo

Что это соответствует?

  • [#.]?[^{}]*{[^{}]*[{}][^{}]*}(*SKIP)(*F) — необязательный . или же # (увидеть [#.]?) с последующими 0+ символами, кроме { а также } (увидеть [^{}]*) с последующим {с последующим [^{}]*с последующим либо { или же } (увидеть [{}]) а потом опять [^{}]* и закрытие }, Эта часть соответствует строки как .something{ или ничего. Затем, после совпадения, отбросьте этот матч из совпадений, возвращенных из-за (*SKIP)(*FAIL) глаголы.
  • | — или же…
  • [#.]?[^{}]*{([^{}]+)} — необязательный . или же # (увидеть [#.]?) с последующими 0+ символами, кроме { а также } (увидеть [^{}]*), затем {, затем 1+ символов, кроме фигурных скобок ([^{}]+) и закрывающая скобка }, Это то, что мы сохраним и получим как спички.

PHP демо:

$re = '~[#.]?[^{}]*{[^{}]*[{}][^{}]*}(*SKIP)(*F)|[#.]?[^{}]*{([^{}]+)}~';
$str = "{amdnia91(+wowa}\n{amdn{ia91(+wowa}\n.something{property:value;prop2:value}#something2{someprop:val;prop:val}\n.something{property:value{;prop2:value}#something2{someprop:val;prop:val}\n.something{property:v}alue;prop2:value}#something2{someprop:val;prop:val}";
preg_match_all($re, $str, $matches);
print_r($matches);

Результат:

Array
(
[0] => Array
(
[0] => {amdnia91(+wowa}
[1] =>
.something{property:value;prop2:value}
[2] => #something2{someprop:val;prop:val}
[3] => #something2{someprop:val;prop:val}
[4] => #something2{someprop:val;prop:val}
)

[1] => Array
(
[0] => amdnia91(+wowa
[1] => property:value;prop2:value
[2] => someprop:val;prop:val
[3] => someprop:val;prop:val
[4] => someprop:val;prop:val
)

)
2

По вопросам рекламы [email protected]