php regex для поиска вложенных многострочных комментариев cfml

Используя php, я хотел бы иметь регулярное выражение, которое соответствует вложенным многострочным комментариям в стиле, поддерживаемом ColdFusion:

1. <!--- this is a single comment line --->

2. <!---
multiline
comment
--->

3. <!---
multiline <!--- nested --->
comment <!--- comment --->
--->

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

-1

Решение

Вы можете использовать рекурсивное регулярное выражение PCRE с gs опции:

(?<comment><!---(?(?=<!---)\g<comment>|.)*?--->)

DEMO

Сломать (x Режим):

(?<comment>         # define group "comment"<!---             # match a "<!---"(?(?=<!---)       # is the next sequence a "<!---"\g<comment>     #   yes: match a comment (recurse)
|.              #   no: match a character
)*?               # and repeat
--->              # until a "--->")                   # close "comment" definition
0

Другие решения

Вам нужно использовать рекурсивный шаблон:

<!---(?>[^<-]+|-(?!-->)|<(?!!---)|(?R))*--->

подробности:

<!---
(?>              # open an atomic group
[^<-]+       #   all that is not a < or a -
|              #  OR
-(?!-->)     #   a - not followed by -->
|              #  OR
<(?!!---)    #   a < not followed by !---
|              #  OR
(?R)         #   recursion (repeat the whole pattern itself)
)*               # close the atomic group, repeat zero or more times
--->
1

По вопросам рекламы [email protected]