I'm trying to use Casimir et Hippolyte's pattern (Here) to wrap HTML tags in string.
$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;
After implementing this method, I got an error Compilation failed: assertion expected after (?( at offset 6. What's wrong with this pattern?