0

HTML を bbcode に変換する関数に取り組んでいます。私は独自の [spoiler] bbcode タグを作成しました。これは適切に HTML に相当するものに変換されます。

しかし、それをbbcodeに戻そうとすると、一見同一の文字列と一致しないようです...

問題がどこにあるかを確認するために少しずつ再構築した後、追加したときにのみ失敗することがわかりましたonclick="showSpoiler(this)"

#<div><input type="button" onclick="showSpoiler(this)"/><div>(.*)</div></div>#ig'

私はそれを ( ブラケットにさらに絞り込みました。私はこのようにそれらをエスケープしようとしました \(

[spoiler] タグから生成される html コードは次のとおりです。

`$1

照合される文字列はこれです

'#<div><input type="button" onclick="showSpoiler(this)"/><div>(.*)</div></div>#ig'

ここに変換関数があります

<?php
//This function let convert BBcode to HTML
function bbcode_to_html($text)
{
    $text = nl2br(htmlentities($text, ENT_QUOTES, 'UTF-8'));
    $in = array(
            '#\[b\](.*)\[/b\]#Usi',
            '#\[i\](.*)\[/i\]#Usi',
            '#\[u\](.*)\[/u\]#Usi',
            '#\[s\](.*)\[/s\]#Usi',
            '#\[img\](.*)\[/img\]#Usi',
            '#\[url\]((ht|f)tps?\:\/\/(.*))\[/url\]#Usi',
            '#\[url=((ht|f)tps?\:\/\/(.*))\](.*)\[/url\]#Usi',
            '#\[left\](.*)\[/left\]#Usi',
            '#\[center\](.*)\[/center\]#Usi',
            '#\[right\](.*)\[/right\]#Usi',
            '#\[spoiler\](.*)\[/spoiler\]#Usi',
            '#\[fuck\](.*)\[/fuck\]#Usi'
        );
    $out = array(
            '<strong>$1</strong>',
            '<em>$1</em>',
            '<span style="text-decoration:underline;">$1</span>',
            '<span style="text-decoration:line-through;">$1</span>',
            '<img src="$1" alt="Image" />',
            '<a href="$1">$1</a>',
            '<a href="$1">$4</a>',
            '<div style="text-align:left;">$1</div>',
            '<div style="text-align:center;">$1</div>',
            '<div style="text-align:right;">$1</div>',
            '<div><input type="button" onclick="showSpoiler(this)" value="Show/Hide" /><div class="inner" style="display:none;">$1</div></div>',
            '<div><input type="button" onclick="showSpoiler(this)"/><div>$1</div></div>'
        );
    $count = count($in)-1;
    for($i=0;$i<=$count;$i++)
    {
        $text = preg_replace($in[$i],$out[$i],$text);
    }
    return $text;
}
//This function let convert HTML to BBcode
function html_to_bbcode($text)
{
    $text = str_replace('<br />','',$text);
    $in = array(
        '#<strong>(.*)</strong>#Usi',
        '#<em>(.*)</em>#Usi',
        '#<span style="text-decoration:underline;">(.*)</span>#Usi',
        '#<span style="text-decoration:line-through;">(.*)</span>#Usi',
        '#<img src="(.*)" alt="Image" />#Usi',
        '#<a href="(.*)">(.*)</a>#Usi',
        '#<div style="text-align:left;">(.*)</div>#Usi',
        '#<div style="text-align:center;">(.*)</div>#Usi',
        '#<div style="text-align:right;">(.*)</div>#Usi',
        '#<div><input type="button" onclick="showSpoiler(this)" value="Show/Hide" /><div class="inner" style="display:none;">(.*)</div></div>#Ui',
        '#<div><input type="button" onclick="showSpoiler(this)"/><div>(.*)</div></div>#ig'
    );
    $out = array(
        '[b]$1[/b]',
        '[i]$1[/i]',
        '[u]$1[/u]',
        '[s]$1[/s]',
        '[img]$1[/img]',
        '[url=$1]$2[/url]',
        '[left]$1[/left]',
        '[center]$1[/center]',
        '[right]$1[/right]',
        '[spoiler]$1[/spoiler]',
        '[fuck]$1[/fuck]'
    );
    $count = count($in)-1;
    for($i=0;$i<=$count;$i++)
    {
        $text = preg_replace($in[$i],$out[$i],$text);
    }
    return $text;
}
?>
4

1 に答える 1

1

正規表現では、次のように中かっこをエスケープする必要があります。

showSpoiler\(this\)

正規表現には注意してください。正規表現はそれ自体が言語であり、デバッグを行う関数を追加しない限りデバッグが困難です (たとえば、何が一致したか、それを出力するなど)。

ところで、配列を関数に直接渡すことで、複数の検索と置換操作を実行できます。それらを繰り返す必要はありません。

そのため、マニュアル ページをもう一度よく読んで、preg_replaceパターンをより簡単にデバッグする方法を楽しみにしていてください。たとえば、それらを関数などに入れる前にテストします。

于 2012-06-10T17:01:33.453 に答える