Игнорировать символы в выводе preg_match_all

У меня есть это регулярное выражение:

preg_match_all('/{.*?}/', $html, $matches);

Который возвращает все строки, которые написаны внутри фигурных скобок. Переменная $ match также содержит символы {и}. Как я могу их удалить?

Я не хочу делать:

if ($matches[0] == "{variable}")

И я не хочу добавлять (и) символы в регулярное выражение, потому что я не хочу использовать:

preg_match_all('/{(.*?)}/', $html, $matches);
if ($matches[0][0] == "variable")

Так есть ли более простой способ удалить фигурные скобки из $ match в регулярном выражении?

4

Решение

В PCRE (реализация регулярного выражения в PHP) вы можете использовать обходные пути для выполнения утверждений нулевой длины. Оглядываясь назад, (?<=...), убедитесь, что выражение находится за внутренним указателем. Взгляд в будущее, (?=...), убедитесь, что выражение происходит перед внутренним указателем. Оба могут быть отменены, если это необходимо: (?<!...) или же (?!...),


Это подводит нас к этому выражению:

(?<={).*?(?=})

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


Реализуйте это так же:

preg_match_all('/(?<={).*?(?=})/', $html, $matches);
// $matches[0] = 'variable';

@CasimirEtHippolyte делает хорошую мысль. Это отличный пример того, где ленивое совпадение точек не является необходимым и потенциально снизит производительность при возврате. Вы можете заменить .*? с [^}]* соответствовать 0+ не-} персонажи.

7

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

Или же сброс после { и сопоставлять символы, которые не являются }, Если {} сбалансированы, не нужно другого }

{\K[^}]*

Увидеть пример на regex101

3

(?<={).*?(?=})

Замените свое регулярное выражение этим. Это будет работать.

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