1

我有这个正则表达式,取自 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] 部分,但在某处,某些东西正在把它弄乱,我无法弄清楚。

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 回答