我有这个正则表达式,取自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]部分,但某些地方正在弄乱它,我无法理解它。
答案 0 :(得分:0)
您是否通过浏览器的DOM检查器检查结果?如果是这样,它将自动“纠正”您的标签,以正确的顺序关闭。我认为你的code_highlight_callback
应该是:
function code_highlight_callback($matches) {
return "<pre class='highlighted_code'>".htmlspecialchars($matches[0])."</pre>";
}