1

C#を使用して変更する必要のあるHTMLコンテンツがいくつかあります。概念的には単純ですが、効率的に行う方法がわかりません。コンテンツには、区切られた数字とそれに続く空のアンカータグがいくつか含まれています。区切られた番号を取得して、アンカータグのJavaScript関数呼び出しに挿入する必要があります。例えば

ソース文字列には次のようなものが含まれます。

%%1%%<a href="#"></a> 
<p>A bunch of HTML markup</p>

%%2%%<a href="#"></a>
<p>Some more HTML markup</p>

私はそれをこれに変換する必要があります:

<a href="#" onclick="DoSomething('1')></a> 
<p>A bunch of HTML markup</p>

<a href="#" onclick="DoSomething('2')></a>
<p>Some more HTML markup</p>

%% \ d+%%の発生数に制限はありません。Replaceメソッドを使用できることを期待して正規表現を作成することに失敗しましたが、それが各グループの複数のインスタンスで機能するかどうかはわかりません。これが私が持っていたものです:

%%(?<LinkID>\d+)%%(?<LinkStart><a[\s\S]*?)(?:(?<LinkEnd>>[\s\S]*?)(?=%%\d+|$))

// %%(?<LinkID>\d+)%%        Match a number surrounded by %% and put the number in a group named LinkID
// (?<LinkStart><a[\s\S]*?)  Match <a followed by any characters until next match (non greedy), in a group named LinkStart
// (?:                       Logical grouping that does not get captured
// (?<LinkEnd>>[\s\S]*?)     Match > followed by any characters until next match, in a group named LinkEnd
// (?=%%\d+%%|$)             Where the former LinkEnd group is followed by another instance of a delimited number or the end of the string. (I don't think this is working as I intended.)

おそらく、いくつかの正規表現操作とString.Formatの組み合わせを使用できます。私は正規表現の専門家ではありません。

4

4 に答える 4

1

正規表現を使用してHTMLを解析する方法については、SOで幅広く取り上げられています。 コンセンサスは、それが行われるべきではないということです。

HTMLを解析する必要がある場合は、HTMLAgilityPackなどを使用することをお勧めします。これにより、xPathに似たものを使用して、作業するHTMLを識別できます。

于 2012-06-05T18:06:08.660 に答える
1

あなたの正規表現はほとんどあなたが望むものだと思います-私はそれを少し変更しました。これは$、文字列の最後でのみ一致する場合に機能します。

%%(\d+)%%(<a[^>]*)(></a>)(.*?)(?=%%\d|$)

これを使用することにした場合は、一致するたびにグループにアクセスでき、この方法で新しい文字列を作成できます。これは、既存の文字列の内容を置き換えるよりもおそらく簡単です。

于 2012-06-05T21:23:32.480 に答える
0

これにはstring.splitを使用します。

string emptyAnchor = "<a href=""#""></a>";
string src = GetData();
string[] splits = src.split(new string[]{"%%"}, StringSplitOptions.None);
StringBuilder sb = new StringBuilder();

//first entry is blank, set to 1
int i = 1;
while(i < splits.length)
{
    string id = splits[i];
    //increment for data string
    i++;
    //prehaps use a StringReplaceFirstOccurrence function instead
    sb.Append(splits[i].Replace(emptyAnchor, GetDataFromID(id)));
    i++;
}
string output = sb.ToString();
于 2012-06-05T19:43:06.850 に答える
0

Regex.Replaceは、複数の一致を処理するのに十分なほど賢いことがわかりました。先読みを使用しないように正規表現を変更しました。アイデアは、%%区切り文字内の数字を見つけてグループに追加し、次のアンカータグ内のコンテンツを見つけてグループに追加し、一致全体を、テキストがキャプチャされた新しいバージョンに置き換えることです。 2つのグループが挿入されました。replaceメソッドは、追加のヘルプなしで、後続の一致を自動的に正しく処理するようです。

string originalText = "<h3>%%1%%<a href=\"#\">First Spot</a></h3><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>" +
                            "<h3>%%2%%<a href=\"#\">Second Spot</a></h3><p>Ut vulputate lobortis feugiat.</p>" +
                            "<p>Ut nunc diam, malesuada iaculis viverra nec, auctor eget velit.</p>";

Regex regex = new Regex(@"%%(\d+)%%[\s]*<a[\s\S]*?>([\s\S]*?)</a>");
string result = regex.Replace(originalText, "<a href=\"#\" onclick=\"DoSomething($1)\">$2</a>");
Debug.WriteLine("Original Text: \"" + originalText + "\"");
Debug.WriteLine("Result Text: \"" + result + "\"");

出力:

Original Text: "<h3>%%1%%<a href="#">First Spot</a></h3><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p><h3>%%2%%<a href="#">Second Spot</a></h3><p>Ut vulputate lobortis feugiat.</p><p>Ut nunc diam, malesuada iaculis viverra nec, auctor eget velit.</p>"

Result Text: "<h3><a href="#" onclick="DoSomething(1)">First Spot</a></h3><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p><h3><a href="#" onclick="DoSomething(2)">Second Spot</a></h3><p>Ut vulputate lobortis feugiat.</p><p>Ut nunc diam, malesuada iaculis viverra nec, auctor eget velit.</p>"
于 2012-06-05T21:51:05.153 に答える