Проблема регулярного выражения Lookahead, в которой есть последняя буква - PullRequest
0 голосов
/ 07 июля 2011

Мой код

preg_match_all('/\{([\w]+)(\s.*)?[^\}]\}(.*)\{\/\w+[^\}]\}/', $nbody, $matches );

Мой шаблон

rtrim: Beginning Text{rtrim}  String     {/rtrim}Surrounding Text
camelize: {camelize}Camelize Some Text Like A MediaWiki Title{/camelize}

Date Modifiers
date: {date format="M/d/Y"}June 14th 1965{/date}
iso date: {date format="c"}1310036802{/date}
timestamp date: {date format="c"}June 14th 1965{/date}
time: {time}{/time}

Я пытаюсь заставить свое регулярное выражение работать так, чтобы я мог захватить атрибуты, как видно с {date format = ""} пример.С приведенным выше шаблоном я нахожусь на 99% пути, но он ест последний символ {тегов} без атрибутов.

...
[11] => rtri
[12] => cameliz
[13] => date
[14] => date
...

Как и последний "атрибута соответствует

...
[13] =>  format="M/d/Y
[14] =>  format="c
[15] =>  format="c
...

Буду признателен за любую помощь!

Ответы [ 2 ]

1 голос
/ 07 июля 2011

этот expr, вероятно, подойдет лучше

~{(\w+)(.*?)}(.*?){/\\1}~si
0 голосов
/ 07 июля 2011

Чтобы не "съесть" эти символы, удалите случайные [^\}]. Но я думаю, что вы хотели написать лучшее регулярное выражение с помощью них, может быть что-то вроде:

/\{(\w+)  (?: \s+(\S[^}]*))?  }  (.*?)  \{\/ \1 }/x

(Цитируйте и избегайте его правильно перед использованием.)

Это должно работать намного лучше. По-прежнему не будет работать с вложенными тегами (но если он у вас есть, то вы анализируете HTML с помощью регулярных выражений), также не будет работать, если содержимое тега может иметь } (это можно исправить при необходимости).

...