Я хочу поймать всех персонажей внутри { ... }
,
Если внутри не найдено{
» а также «}
«
Так, например:
{amdnia91(\+wowa}
Лови.
{amdn{ia91(\+wowa}
Не поймать{
«).
preg_match_all('#(.+?)\{(.+?)\}#', $input, $output);
Как это исправить?
РЕДАКТИРОВАТЬ.
Объяснил больше:
Я постараюсь создать css minifier.
Но там мне нужно поймать все имена и содержимое в скобках как отдельное значение массива.
Curret $ input выглядит так:
.something{property:value;prop2:value}#something2{someprop:val;prop:val}
Это также минифицировано, поэтому содержит несколько … {} … {} встроенных.
И мой код ловит все хорошо, но …
Этот улов также, если внутри скобок его скобки,
но я не хочу ловить это, если внутри скобки.
[^}{]
означает соответствовать любому символу, который не является} или {.
Так:
preg_match_all('#\{([^}{]+)\}#', $input, $output);
Тем не менее, обратите внимание, что в вашем {amdn{ia91(+wowa}
пример, это будут соответствовать ia91(+wowa
фрагмент.
РЕДАКТИРОВАТЬ
Если вы не хотели совпадения для второго примера, попробуйте следующее:
preg_match_all('#^[^}{]*\{([^}{]+)\}[^}{]*$#', $input, $output);
Выражение регулярного выражения означает:
^
— начало линии[^}{]*
— Любой символ, который не {или} ноль или более раз\{
— буквальный {характер([^}{]+)
— Захват одного или нескольких символов, которые не являются {или}\}
— буквальный символ[^}{]*
— Любой символ, который не {или} ноль или более раз$
— конец строкиВторой Править
Учитывая ваше дальнейшее объяснение того, что вам нужно, я бы предложил это:
preg_match_all('#(?<=^|})[^}{]*?\{([^}{]+?)\}(?=[^}]*$|[^}]*\{)#', $input, $output);
Это использует «оглядываться назад» и «заглядывать вперед». Сломанный, это означает:
(?<=^|})
Lookbehind: утверждают, что это либо начало строки, либо предыдущий символ был литералом ‘}’ но не включайте этого персонажа как часть всего матча[^}{]*?
— лениво сопоставлять ноль или более символов, которые не являются {или}\{
— буквально {([^}{]+?)
— Ленивый захват одного или нескольких символов, которые не являются {или}\}
— буквальный}(?=[^}]*$|[^}]*\{)
— Lookahead: убедитесь, что следующие символы — это ноль или более символов, за которыми не}, после которых следует конец строки, или ноль или более символов, за которыми не следует}, за которыми следует литерал { но не включайте эти символы как часть всего матчаЯ публикую альтернативу регулярному выражению, опубликованному daiscog, на основе концепции сопоставления того, что нам не нужно, и исключения из нее, и сопоставления того, что нам нужно позже, с помощью PCRE. (*SKIP)(*FAIL)
глаголы:
[#.]?[^{}]*{[^{}]*[{}][^{}]*}(*SKIP)(*F)|[#.]?[^{}]*{([^{}]+)}
Увидеть regex demo
Что это соответствует?
[#.]?[^{}]*{[^{}]*[{}][^{}]*}(*SKIP)(*F)
— необязательный .
или же #
(увидеть [#.]?
) с последующими 0+ символами, кроме {
а также }
(увидеть [^{}]*
) с последующим {
с последующим [^{}]*
с последующим либо {
или же }
(увидеть [{}]
) а потом опять [^{}]*
и закрытие }
, Эта часть соответствует строки как .something{
или ничего. Затем, после совпадения, отбросьте этот матч из совпадений, возвращенных из-за (*SKIP)(*FAIL)
глаголы.|
— или же…[#.]?[^{}]*{([^{}]+)}
— необязательный .
или же #
(увидеть [#.]?
) с последующими 0+ символами, кроме {
а также }
(увидеть [^{}]*
), затем {
, затем 1+ символов, кроме фигурных скобок ([^{}]+
) и закрывающая скобка }
, Это то, что мы сохраним и получим как спички.$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
)
)