-1

次のHTMLコードがあり、レベル3までネストされています。

<div class="sp-wrap">
    <div class="sp-body" title="FAQ">
        Some text
        <div class="sp-wrap">
            <div class="sp-body" title="title1"> // Level 2
            Text1...
            </div>
        </div>
        <div class="sp-wrap">
            <div class="sp-body" title="title2"> // Level 2
            Text2...
            </div>
        </div>
        <div class="sp-wrap">
            <div class="sp-body" title="title3"> // Level 2
            Text3...
            <div class="sp-wrap">
                <div class="sp-body" title="title4"> // Level 3
                Text4...
                </div>
            </div>
        </div>
    </div>
</div>

divタグをbbcodeに置き換える必要があり、正規表現はネストされていないスポイラーに対してのみ機能します。

Regex.Replace(outstring, 
              @"<div class=""sp-body"" title=""(.*?)"">(.*?)</div>", 
              "[spoiler=$1]$2[/spoiler]", 
              RegexOptions.Singleline);
4

4 に答える 4

0

正規表現のループを作成します。

var rgx = new Regex(@"<div class=""sp-body"" title=""(.*?)"">(.*?)</div>");
while (rgx.IsMatch(outstring))
{
    outstring = rgx.Replace(outstring, "[spoiler=$1]$2[/spoiler]");
}
于 2012-07-18T10:23:04.397 に答える
0

コードの問題は、最初に出現した div と次に近い /div の出現である div のみを置き換えることです。

<div>                    // replaced
    <div>                // not replaced 
    </div>               // replaced
</div>                   // not replaced

これを行う 1 つの方法は、それを XML にロードしてから、XPATH を使用して関心のあるノードのみを変更することです。HTML の場合は、HTML パーサーを使用してから CSS セレクターを使用することもできます。

開始 div は (クラスと照合することで) 簡単に変更できますが、対応する終了 div を正規表現で知る方法はありません。

于 2012-07-18T10:03:08.137 に答える
0

テストしませんでしたが、アイデアはうまくいくはずです:

string s1 = Regex.Replace(outstring, @"<div class=""sp-body"" title=""(.*?)"">", "[spoiler=$1]", RegexOptions.Singleline);
string s2 = Regex.Replace(s1, @"</div>", "[/spoiler]", RegexOptions.Singleline);

編集:

string s1 = Regex.Replace(outstring, @"<div class=""sp-wrap"">\s*<div class=""sp-body"" title=""(.*?)"">", "[spoiler=$1]", RegexOptions.Singleline);
string s2 = Regex.Replace(s1, @"</div>\s*</div>", "[/spoiler]", RegexOptions.Singleline);

次のようなものを生成する必要があります

[spoiler=FAQ]
    Some text
    [spoiler=title1] // Level 2
        Text1...
        [/spoiler]
    [spoiler=title2] // Level 2
        Text2...
        [/spoiler]
    [spoiler=title3] // Level 2
        Text3...
        [spoiler=title4] // Level 3
            Text4...
            [/spoiler]
    [/spoiler]
</div>

ご覧のとおり、完全にインデントされているわけではなく (修正される可能性があると思います) </div>、例で欠落している 1 つを検出します。

于 2012-07-18T10:03:33.747 に答える