Это шаблон, чтобы соответствовать содержанию внутри двойных фигурных скобках:
$pattern = <<<'LOD'
~
(?(DEFINE)
(?<quoted>
' (?: [^'\\]+ | (?:\\.)+)++ ' |
" (?: [^"\\]+ | (?:\\.)+)++ "
)
(?<nested>
{ (?: [^"'{}]+ | \g<quoted> | \g<nested>)*+ }
)
)
{{
(?<content>
(?:
[^"'{}]+
| \g<quoted>
| \g<nested>
)*+
)
}}
~xs
LOD;
Компактная версия:
$pattern = '~{{((?>[^"\'{}]+|((["\'])(?:[^"\'\\\]+|(?:\\.)+|(?:(?!\3)["\'])+)++\3)|({(?:[^"\'{}]+|\g<2>|(?4))*+}))*+)}}~s';
Содержимое находится в первой группе захвата, но вы можете использовать именованный захват 'content'
с подробной версией.
Если этот шаблон длиннее, он позволяет использовать все, что вы хотите, внутри цитируемых частей, включая экранированные кавычки, и во многих случаях быстрее, чем простой ленивый квантификатор. Вложенные фигурные скобки также разрешены, вы можете написать {{ doThat(){ doThis(){ }}}}
без проблем.
подшаблоне цитаты могут быть написаны как это тоже, избегая повторять то же самое для одинарных и двойных кавычек (я использую его в компактной версии)
(["']) # the quote type is captured (single or double)
(?: # open a group (for the various alternatives)
[^"'\\]+ # all characters that are not a quote or a backslash
| # OR
(?:\\.)+ # escaped characters (with the \s modifier)
| #
(?!\g{-1})["'] # a quote that is not the captured quote
)++ # repeat one or more times
\g{-1} # the captured quote (-1 refers to the last capturing group)
Примечание: обратная косая черта должна быть написана \\
в синтаксис nowdoc, но \\\
или \\\\
внутри одиночных кавычек.
Пояснения к детальным рисунком:
Картина разделена на две части:
- определения, где я определяю по имени Подмаски
- сама вся картина
Определение раздел полезен, чтобы избежать повторения всегда одного и того же подшаблона несколько раз в основном шаблоне или сделать его более понятным. Вы можете определить подшаблоны, что вы будете использовать позже в этом пространстве:
(?(DEFINE)....)
Этот раздел содержит 2 именованных подшаблоны:
- цитируемого: который содержит описание цитируемых частей
- вложенной: который описывает вложенные фигурные скобки.
det Айыл вложенного
(?<nested> # open the named group "nested"
{ # literal {
## what can contain curly brackets? ##
(?> # open an atomic* group
[^"'{}]+ # all characters one or more times, except "'{}
| # OR
\g<quoted> # quoted content, to avoid curly brackets inside quoted parts
# (I call the subpattern I have defined before, instead of rewrite all)
| \g<nested> # OR curly parts. This is a recursion
)*+ # repeat the atomic group zero or more times (possessive *)
} # literal }
) # close the named group
(* Более подробная информация о atomic groups и possessive quantifiers)
Но все это суть лишь определения, картина начинается действительно с: {{
Затем я открываю именем захвата группы (content
), и я описываю, что можно найти внутри, (здесь ничего нового).
Используется для модификаторов, x
и s
. x
активирует подробный режим, который позволяет свободно помещать пробелы в шаблон (полезно для отступов). s
- это режим одиночной линии. В этом режиме точка может соответствовать новым строкам (по умолчанию она не может быть). Я использую этот режим, потому что есть точка в подшаблоне quoted
.
Просто введением в HTML и Regex: http://stackoverflow.com/a/1732454/758446 – BlackVegetable
Вы можете использовать общий placeholder вместо отрицательного charclass для исключения '{' и '}' внутри. – mario
Как мы все знаем, регулярные выражения чрезвычайно медленны, особенно когда речь идет о больших строках. В вашем случае вы можете просто придерживаться 'str_replace()', и это будет достаточно для вас. – Yang