我有一个很小的bbcode解析器,除了pre和code标签之外,效果非常好。我需要整个解析器函数忽略pre和code标签。我怎么会这样做?如果有人有想法,请告诉我。
我要做的是当我使用<pre>
或<code>
标记时,它会忽略内部使用的bbcode,但会在页面上的其他位置解析它。我认为它可以通过正则表达式和preg_match或preg_replace来实现。
function parse($text) {
$search = array(
'/\*\*(.*?)\*\*/is', // bold
'/\/\/(.*?)\/\//is', // italic
'/__(.*?)__/is', // underline
); #search
$replace = array(
'<b>$1</b>',
'<i>$1</i>',
'<u>$1</u>',
); #replace
return preg_replace($search, $replace, $text);
} #parse
<pre>
** Bold Text **
// Italic Text //
__ Uderline Text __
</pre>
<code>
** Bold Text **
// Italic Text //
__ Uderline Text __
</code>
任何帮助都是先发制人的。谢谢。
答案 0 :(得分:1)
首先,那不是BBCode。 BBCode使用[
和]
作为分隔符来模仿常见的HTML标记标记。你有什么,类似于Markdown或reStructuredText。
其次,您更换算法非常简单,将来可能会给您带来很多麻烦。如果您不仅仅是为了学习如何使用PHP编写代码,我建议您使用已经执行过您想做的现有解析器,例如PHP Markdown,PHP reStrucuredText或PHP BBCode Parser
现在,至于你的实际问题:这并不容易,但你可以从改变你的正则表达式开始,这样它们只有在不在<pre>
标签内时才适用:(未经测试)
'/(?<!<pre>).*?\*\*(.*?)\*\*.*?(?!</pre>)/is', // bold