0

我有一个运行良好的小型 bbcode 解析器,除了 pre 和 code 标记。我需要让整个解析器函数忽略 pre 和 code 标记。我将如何实现这一目标?如果有人有想法,请告诉我。

我想要做的是,当我使用<pre>or<code>标记时,它会忽略内部使用的 bbcode,但会在页面上的其他任何地方解析它。我认为它可以通过 regex 和 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>

任何帮助都会受到欢迎。谢谢你。

4

1 回答 1

1

首先,这不是 BBCode。BBCode 使用[]作为分隔符来模仿常见的 HTML 标记标签。你所拥有的是类似于 Markdown 或 reStructuredText 的东西。

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

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

'/(?<!<pre>).*?\*\*(.*?)\*\*.*?(?!</pre>)/is',  // bold
于 2012-08-24T14:19:47.247 回答