0

preタグとcodeタグを除いて、非常にうまく機能する小さなbbcodeパーサーがあります。パーサー関数全体で 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>

任意のヘルプが優先されます。ありがとうございました。

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 に答える