1

我围绕 Pygments 库制作了一个 PHP 包装器,用于突出显示代码块。用于代码块检测的正则表达式可以在配置文件中配置。(json格式)

在 json 值中看起来像这样:

{ 
    "codeblock_regex": "\\[pygments=(.*?)\\](.*?)\\[\\/pygments\\]" 
}

在它被 JSON 解码后应该是这样的:

\[pygments=(.*?)\](.*?)\[\/pygments\]

这很糟糕,因为它不允许转义,我希望人们能够这样做:

\[pygments=lexer]some code here[/pygments]

和 pygments 来检测\并忽略该代码块。我试过了

 "(^\\\\)\\[pygments=(.*?)\\](.*?)\\[\\/pygments\\]"

之后应该是这样的json_decode

 (^\\)\[pygments=(.*?)\](.*?)\[\/pygments\]

但是,这只会使它忽略所有内容,甚至是常规块,所以一定是我做错了。如您所见,我离正则表达式专家还差得很远。

4

1 回答 1

1

您需要的是一个相当棘手的正则表达式功能,称为“零宽度否定后向断言”。“零宽度”意味着它匹配输入的零个字符,“负”意味着它只有在不匹配时才成功找到时才成功,而“向后看”意味着它向后看。

这个的语法是你不想在(?<!test)那里的东西。test

在您的情况下,您想匹配 a[但如果前面有 a 则忽略它\,两者都需要转义,所以您需要(?<!\\)\[

所以你的正则表达式最终为(在 PHP 中)$re = '/(?<!\\\\)\[pygments=(.*?)\](.*?)\[\/pygments\]/';

根据json_encode,然后"\/(?<!\\\\)\\[pygments=(.*?)\\](.*?)\\[\\\/pygments\\]\/"以 JSON 形式结束。我觉得我的眼睛开始变得有趣了所有的反斜杠......;)

于 2013-02-18T20:45:22.633 回答