2

私はbbcode->htmlを解析するためにこの関数を持っています:

  $this->text = preg_replace(array(
    '/\[b\](.*?)\[\/b\]/ms', 
    '/\[i\](.*?)\[\/i\]/ms',
    '/\[u\](.*?)\[\/u\]/ms',
    '/\[img\](.*?)\[\/img\]/ms',
    '/\[email\](.*?)\[\/email\]/ms',
    '/\[url\="?(.*?)"?\](.*?)\[\/url\]/ms',
    '/\[size\="?(.*?)"?\](.*?)\[\/size\]/ms',
    '/\[youtube\](.*?)\[\/youtube\]/ms',
    '/\[color\="?(.*?)"?\](.*?)\[\/color\]/ms',    
    '/\[quote](.*?)\[\/quote\]/ms',
    '/\[list\=(.*?)\](.*?)\[\/list\]/ms',
    '/\[list\](.*?)\[\/list\]/ms',
    '/\[\*\]\s?(.*?)\n/ms'
   ),array(
    '<strong>\1</strong>',
    '<em>\1</em>',
    '<u>\1</u>',
    '<img src="\1" alt="\1" />',
    '<a href="mailto:\1">\1</a>',
    '<a href="\1">\2</a>',
    '<span style="font-size:\1%">\2</span>',
    '<object width="450" height="350"><param name="movie" value="\1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="\1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="450" height="350"></embed></object>',
    '<span style="color:\1">\2</span>',
    '<blockquote>\1</blockquote>',
    '<ol start="\1">\2</ol>',
    '<ul>\1</ul>',
    '<li>\1</li>'
   ),$original);

問題は、html-> bbcodeのように、これをどのように解析解除するかです。

私の正規表現スキルは貧弱です:(

ありがとう。

4

3 に答える 3

7

しないでください。

代わりに、元の未解析のテキストと処理済みの解析済みテキストの両方を保存します。はい、これによりストレージ要件が2倍になりますが、次のことも非常に簡単になります。

  1. BBCodeを解析せずにオリジナルのユーザー編集を許可する
  2. 再度解析せずに、他のユーザー投稿の引用を許可する
  3. 各BBCodeが生成するHTMLを変更します(すべての投稿を再解析するだけです)
  4. BBCodeエンジンをダウンラインに切り替えます(ここでも、すべての投稿を再解析するだけです)
于 2010-07-17T17:18:09.233 に答える
5

たくさんの正規表現を使ってhtmlをbbcodeに変換する信頼できる方法を構築することはほぼ不可能だと言っても過言ではありません。パーサー(たとえばDOMDocument)を使用し、xpathとinspectionを使用して無効な要素と属性を削除し、それを再帰的にウォークして途中でbbcode文字列を作成します(または途中で無効なタグ/属性を無視します)。

于 2010-07-17T17:14:34.447 に答える
3

de-bbcode したい HTML コードがメソッドを使用して en-bbcode されたことが正確にわかっている場合は、次の手順を実行します。

に渡す 2 つの配列を切り替えますpreg_replace

HTML コードを含む配列で、すべての要素に対して次の操作#を行います。 文字列の先頭に追加します。追加し#sます。\1(および\2aso) を に置き換え(.*?)ます。

bbcode を含む配列の場合、すべての要素で次の操作を行います。/先頭と/ms末尾を削除します。に置き換え\sます。すべて削除します\。すべて削除します?(.*)文字列の最初を に$1、2 番目をに置き換え$2ます。

これで十分です。何か問題があれば: 質問してください ;)

于 2010-07-17T17:24:11.923 に答える