doujiushi9007 2014-04-04 18:15
浏览 33
已采纳

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

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?

  • 写回答

1条回答 默认 最新

  • duanlie1298 2014-04-04 18:57
    关注

    After some researches, it seems that PCRE versions < 7.2 have this kind of bug with the DEFINE syntax.

    You can write the same pattern like that:

    $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;
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 孟德尔随机化怎样画共定位分析图
  • ¥18 模拟电路问题解答有偿速度
  • ¥15 CST仿真别人的模型结果仿真结果S参数完全不对
  • ¥15 误删注册表文件致win10无法开启
  • ¥15 请问在阿里云服务器中怎么利用数据库制作网站
  • ¥60 ESP32怎么烧录自启动程序
  • ¥50 html2canvas超出滚动条不显示
  • ¥15 java业务性能问题求解(sql,业务设计相关)
  • ¥15 52810 尾椎c三个a 写蓝牙地址
  • ¥15 elmos524.33 eeprom的读写问题