использование preg_match_all для вложенных скобок

У меня есть такая строка:

Это {{текст}} для {{тестирования}} PHP {{регулярного выражения}}

Я использую следующий шаблон, чтобы получить массив, содержащий {{text}} , {{testing}} , {{регулярное выражение}}

/\{\{.+\}\}/

Но он возвращает массив только с 1 элементом:

"{{текст}} для {{тестирования}} php {{регулярное выражение}}"

Еще пробовал вот это:

/\{\{(?R)|.+\}\}/

Но я получаю тот же результат.

Что не так с этим шаблоном?

Спасибо.


person Nick.h    schedule 03.04.2011    source источник
comment
'/\{.*?\}/i', почему вы пытаетесь сопоставить двойные скобки? попробуйте мое регулярное выражение и сообщите нам, если вы получите желаемый результат.   -  person Poelinca Dorin    schedule 03.04.2011
comment
@poelinca: Извините за ошибку. Отредактировано!   -  person Nick.h    schedule 03.04.2011
comment
'/\{\{.*?\}\}/i' должно работать   -  person Poelinca Dorin    schedule 03.04.2011


Ответы (2)


Попробуйте использовать /\{\{.+?\}\}/, обратите внимание на ?, оригинал жадный, это означает, что он будет соответствовать максимальному количеству символов, и если у вас есть .+, это означает, что он будет идти от первого { до последнего }.

+?, *? — это нежадные версии + и *.

person Daniel Dinu    schedule 03.04.2011

Я думаю, что более быстрым решением было бы регулярное выражение /\{\{([^}]+)\}\}/, потому что нежадный квантификатор получает букву за буквой, пока не достигнет правой скобки, в то время как это регулярное выражение съедает все до правой скобки с первой попытки.

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

Кроме того, я думаю, что OP хочет работать с совпадающим результатом, поэтому добавил совпадающие скобки вокруг [^}]+.

person hejdav    schedule 26.06.2014