php正则表达式找到嵌套的多行cfml注释

时间:2014-10-24 23:05:18

标签: php regex nested comments multiline

使用php,我希望有一个与ColdFusion支持的样式的嵌套AND多行注释相匹配的正则表达式:

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

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

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

所有这三种情况都是单一有效的cfml评论。我发现很多正则表达式适用于前两种情况,但不是第三种正常情况。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

您需要使用递归模式:

<!---(?>[^<-]+|-(?!-->)|<(?!!---)|(?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 :(得分:0)

您可以使用带有gs选项的递归PCRE正则表达式:

(?<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