0

文字列ビルダーとしてhtmlファイルを読みました.h1、h2、およびh3の間にアンカータグを配置し、異なるidとhrefリンクを提供したいと思います。では、どうすればこれを達成できますか。次のことをしたいです。試してみSb.Replace("<h1>", "<h1> <a id=1>"); ましたが、アンカータグに一意のIDを与えることができません.h1、h2、およびh3をすべて読み取ってアンカータグを配置し、アンカータグに一意のIDを与えるにはどうすればよいですか.

4

1 に答える 1

1

名前空間で呼び出して、新しい ID を割り当てるカスタム コールバックを定義できRegex.Replaceます。System.Text.RegularExpressionsMatchEvaluator

次のようなもの:

var regHeaders = new Regex(@"<(?<close>/)?h(?<header>\d)\s*>", RegexOptions.Compiled | RegexOptions.IgnoreCase);
var replaced = regHeaders.Replace(sb.ToString(), new MatchEvaluator(EvaluateHeaders));

そして、EvaluateHeaders コールバックを次のように定義します。

private static string EvaluateHeaders(Match m)
{
    bool closeTag = m.Groups["close"].Success;
    switch (int.Parse(m.Groups["header"].Value))
    {
        case 1: // h1
            return closeTag ? "</a></h1>" : "<h1><a href=\"header1\">Header1";
        // todo: your own implementation of the various other headers.
        default:
            return m.Value;
    }
}

編集
あなたの最新のコメントに照らして、コードを次のように変更しました。

var regHeaders = new Regex(@"<h(?<header>\d)\s*>(?<content>.+?)</h\1>", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline);
var replaced = regHeaders.Replace(sb.ToString(), EvaluateHeaders);

private static string EvaluateHeaders(Match m)
{
    switch(int.Parse(m.Groups["header"].Value))
    {
        case 1: // <h1>content</h1>
            return string.Format("<h1><a href=\"#\" id=\"{0}\">{0}</a><h1>", m.Groups["content"].Value);
        default:
            return m.Value;
    }
}
于 2012-09-20T06:02:18.343 に答える