1

コード ブロックを強調表示する Pygments ライブラリの PHP ラッパーを作成しました。コードブロックの検出に使用される正規表現は、構成ファイルで構成できます。(json形式)

json 値では次のようになります。

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

JSON でデコードすると、次のようになります。

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

エスケープができないので、これは悪いことです。私は人々にこれができるようにしてほしい:

\[pygments=lexer]some code here[/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 に答える