0

我已经阅读了一个作为字符串生成器的 html 文件。现在我想在 h1、h2 和 h3 之间放置锚标记并提供不同的 id 和 href 链接。那么我怎样才能做到这一点。我想做以下事情。我已经尝试过Sb.Replace("<h1>", "<h1> <a id=1>"); ,但我不能给锚标签提供唯一的 ID。那么我怎样才能读取所有 h1、h2 和 h3 并放置锚标签并为锚标签提供唯一的 ID。

4

1 回答 1

1

您可以Regex.ReplaceSystem.Text.RegularExpressions命名空间中调用并定义一个自定义MatchEvaluator回调,您可以在其中分配新的 id。

类似于以下内容:

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 回答