我已经读取了一个html文件作为字符串builder.Now我想在h1,h2和h3之间放置锚标记,并给出不同的id和href链接。那么我怎么能实现这一点。我想要做下面的事情。
我已经尝试了Sb.Replace("<h1>", "<h1> <a id=1>");
但是我不能给uniqe Id锚定标签。所以如何读取所有h1,h2和h3并放置锚标签并给锚标签赋予唯一ID。
答案 0 :(得分:1)
您可以在Regex.Replace
命名空间中调用System.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;
}
}