PHP BBCode解析器

时间:2012-08-24 14:11:08

标签: php

我有一个很小的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>

任何帮助都是先发制人的。谢谢。

1 个答案:

答案 0 :(得分:1)

首先,那不是BBCode。 BBCode使用[]作为分隔符来模仿常见的HTML标记标记。你有什么,类似于Markdown或reStructuredText。

其次,您更换算法非常简单,将来可能会给您带来很多麻烦。如果您不仅仅是为了学习如何使用PHP编写代码,我建议您使用已经执行过您想做的现有解析器,例如PHP MarkdownPHP reStrucuredTextPHP BBCode Parser

现在,至于你的实际问题:这并不容易,但你可以从改变你的正则表达式开始,这样它们只有在不在<pre>标签内时才适用:(未经测试)

'/(?<!<pre>).*?\*\*(.*?)\*\*.*?(?!</pre>)/is',  // bold