Я пытаюсь разработать строку регулярных выражений PCRE для сопоставления и захвата строк переменной длины для использования в моем приложении PHP. Я хотел бы (если это возможно) выполнить действия за один раз, но если это кажется наиболее разумным в вычислительном отношении, я могу разделить его на несколько прогонов, разделенных логикой приложения.
Несколько примеров строк, которые могут содержаться в гораздо больших блоках текста:
{{ var:myVar }}
{{ component:myComponent}}
{{ var:myVar modifier:function[arg1|arg2] }}
{{ region:myRegion modifier:function[arg1|arg2] modifier:function[arg1] }}
Как видите, между целевыми строками может быть значительная разница. Обобщенная:
{{ type:name modifierType:modifierName[arg1|arg2|...] }}
- Разделители
{{
и }}
.
- Действительный
type
или name
выражается как [a-z_][a-z0-9_]*
; Будет только одна type:name
пара, и она появится первой.
- Действительный
modifierType
или modifierName
выражается как [a-z_][a-z0-9_]
; За modifierName
следует список аргументов из одного или более аргументов в квадратных скобках, [
и ]
. Список аргументов ограничен трубами |
. Может быть ноль или более modifierType:modifierName[argumentList]
комплектов.
- Все части строки отделяются одним или несколькими пробелами
\s+
В любом случае, сопоставить наборы, которые имеют {{ type:name }}
, достаточно просто, но я не могу найти способ эффективно получить списки модификаторов переменной длины. Для простой пары тип / имя я использую следующую строку без учета регистра / свободного пробела:
'% {{ \s+ (?<type>var|component|region):(?<name>[a-z_][a-z0-9_]*) \s+ }} %ix'
Скорее всего, я собираюсь поменять список типов для захвата буквенно-цифровой строки для обеспечения прямой совместимости, но пока это работает.
Итак, любые предложения по захвату обоих:
{{ component:myComponent }}
{{ var:myVar format:datetime[Y-m-d] container:h3[class=timestamp|id=main] }}