Помощь с Regex (PCRE) - PullRequest
       9

Помощь с Regex (PCRE)

0 голосов
/ 05 ноября 2010

Я пытаюсь разработать строку регулярных выражений 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] }}

1 Ответ

2 голосов
/ 05 ноября 2010

Вы не хотите собирать все это в одном регулярном выражении, поскольку вы, вероятно, хотите, чтобы модификаторы были массивом. Регулярное выражение всегда будет иметь постоянное число захватов, соответствующее количеству захватывающих скобок.

Возьмите главное ({{ something }}), разделите содержимое по пробелам, затем зациклите и сопоставьте каждое по отдельности, поместив содержимое в соответствующий скаляр или массив (если вы разрешите большее количество модификаторов с тем же префиксом). *

...