1

[code][/code] タグをキャプチャするために PHP.net から取得したこの正規表現があります。

function code_highlight($code)
{
    return $code = preg_replace_callback('#\[code]((?:[^[]|\[(?!/?code])|(?R))+)\[/code]#', 'code_highlight_callback', $code);
}

私のコールバック関数は次のとおりです。

function code_highlight_callback($matches)
{
    return "<pre class='highlighted_code'>" . $matches[0] . "</pre>";
}

行を返す代わりにエコーすると、htmlentities()次の行に沿って何かが得られます。

<pre class='highlighted_code'>
    [code]int main()</div> 
    <div>{</div> 
    <div>}</div> 
    <div>[/code]
</pre>

正規表現に関する限り、すべて問題ないようです。ただし、戻り値を出力すると、ソース コードは次のようになります。

<div>
    <div>
        <pre class="highlighted_code">[code]int main()</pre>
    </div>
    <div>{</div>
    <div>}</div>
    <div>[/code] </div>
</div>

PRE タグが移動して短くなるのはなぜですか? 正規表現は、文字列の [code] [/code] セクション全体を明確にキャプチャしていますが、どこかで何かが混乱していて、私には理解できません。

4

1 に答える 1

0

ブラウザーの DOM インスペクターで結果を確認していますか? その場合、タグが正しい順序で閉じるように自動的に「修正」されます。私はあなたcode_highlight_callbackがすべきだと思います:

function code_highlight_callback($matches) {
    return "<pre class='highlighted_code'>".htmlspecialchars($matches[0])."</pre>";
}
于 2012-09-17T18:41:33.657 に答える