RegEx匹配正常,但HTML输出不好

时间:2012-09-17 18:38:08

标签: php regex

我有这个正则表达式,取自PHP.net来捕获[code] [/ code]标签。

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]部分,但某些地方正在弄乱它,我无法理解它。

1 个答案:

答案 0 :(得分:0)

您是否通过浏览器的DOM检查器检查结果?如果是这样,它将自动“纠正”您的标签,以正确的顺序关闭。我认为你的code_highlight_callback应该是:

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