正则表达式 - 编译失败:在偏移6处预期断言

时间:2014-04-04 18:15:30

标签: php regex

我正在尝试使用Casimir et Hippolyte的模式(Here)将HTML标记包装在字符串中。

$html = <<<EOD
    $str
EOD;

    $pattern = <<<'EOD'
    ~
    (?(DEFINE)
        (?<self>    < [^\W_]++ [^>]* > )
        (?<comment> <!-- (?>[^-]++|-(?!->))* -->)
        (?<cdata>   \Q<![CDATA[\E (?>[^]]++|](?!]>))* ]]> )
        (?<text>    [^<]++ )
        (?<tag>
            < ([^\W_]++) [^>]* >
            (?> \g<text> | \g<tag> | \g<self> | \g<comment> | \g<cdata> )*
            </ \g{-1} >
        )
    )
    # main pattern
    (?: \g<tag> | \g<self> | \g<comment> | \g<cdata> )+
    ~x
EOD;

实现此方法后,我收到错误Compilation failed: assertion expected after (?( at offset 6。这种模式有什么问题?

1 个答案:

答案 0 :(得分:1)

经过一些研究,似乎PCRE版本&lt; 7.2 DEFINE语法有这种错误。

您可以编写相同的模式:

$pattern = <<<'EOD'
~
(?:
    (?<tag>
            < ([^\W_]++) [^>]* >
            (?> (?<text> [^<]++ )
              | \g<tag>
              | (?<self> < [^\W_]++ [^>]* > )
              | (?<comment> <!-- (?>[^-]++|-(?!->))* -->)
              | (?<cdata> \Q<![CDATA[\E (?>[^]]++|](?!]>))* ]]>)
            )*
            </ \g{2} > # second group from pattern start (<tag> is 1st)
    )
  | \g<self> | \g<comment> | \g<cdata>
)+
~x
EOD;