У меня есть это регулярное выражение:
preg_match_all('/{.*?}/', $html, $matches);
Который возвращает все строки, которые написаны внутри фигурных скобок. Переменная $ match также содержит символы {и}. Как я могу их удалить?
Я не хочу делать:
if ($matches[0] == "{variable}")
И я не хочу добавлять (и) символы в регулярное выражение, потому что я не хочу использовать:
preg_match_all('/{(.*?)}/', $html, $matches);
if ($matches[0][0] == "variable")
Так есть ли более простой способ удалить фигурные скобки из $ match в регулярном выражении?
В PCRE (реализация регулярного выражения в PHP) вы можете использовать обходные пути для выполнения утверждений нулевой длины. Оглядываясь назад, (?<=...)
, убедитесь, что выражение находится за внутренним указателем. Взгляд в будущее, (?=...)
, убедитесь, что выражение происходит перед внутренним указателем. Оба могут быть отменены, если это необходимо: (?<!...)
или же (?!...)
,
Это подводит нас к этому выражению:
(?<={).*?(?=})
Реализуйте это так же:
preg_match_all('/(?<={).*?(?=})/', $html, $matches);
// $matches[0] = 'variable';
@CasimirEtHippolyte делает хорошую мысль. Это отличный пример того, где ленивое совпадение точек не является необходимым и потенциально снизит производительность при возврате. Вы можете заменить .*?
с [^}]*
соответствовать 0+ не-}
персонажи.
Или же сброс после {
и сопоставлять символы, которые не являются }
, Если {}
сбалансированы, не нужно другого }
{\K[^}]*
Увидеть пример на regex101
(?<={).*?(?=})
Замените свое регулярное выражение этим. Это будет работать.