C#替换多个href值

时间:2011-06-07 22:35:03

标签: c# html regex html-parsing

我有一块看起来像这样的html;

<p><a href="docs/123.pdf">33</a></p>

基本上有数百个锚链接我需要根据锚文本替换href。例如,我需要用以下内容替换上面的链接

<a href="33.html">33</a>. 

我需要取值33并在我的数据库上查找以找到用href替换href的新链接。

我需要将其全部保存在上面的原始html中!

我该怎么做?救命啊!

5 个答案:

答案 0 :(得分:5)

虽然这不能解答您的问题,但HTML Agility Pack是操作和使用HTML的绝佳工具:http://html-agility-pack.net

它至少可以抓住你需要的值,并且更容易替换。

包含使用HTML Agility Pack的链接:How to use HTML Agility pack

答案 1 :(得分:1)

将HTML粘贴到XmlDocument中(您的标记有效,不是吗?)然后使用XPath查找具有<a>属性的所有href标记。应用转换并将新值分配给href属性。然后写出XmlDocument。

容易!

答案 2 :(得分:0)

使用正则表达式查找值并替换 像"/<p><a herf=\"[^\"]+\">([^<]+)<\\/a><\\/p>这样的正则表达式匹配并捕获ancor文本

答案 3 :(得分:0)

考虑使用以下粗略算法。

using System;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

static class Program
{
  static void Main ()
  {
    string html = "<p><a href=\"docs/123.pdf\">33</a></p>"; // read the whole html file into this string.
    StringBuilder newHtml = new StringBuilder (html);
    Regex r = new Regex (@"\<a href=\""([^\""]+)\"">([^<]+)"); // 1st capture for the replacement and 2nd for the find
    foreach (var match in r.Matches(html).Cast<Match>().OrderByDescending(m => m.Index))
    {
       string text = match.Groups[2].Value;
       string newHref = DBTranslate (text);
       newHtml.Remove (match.Groups[1].Index, match.Groups[1].Length);
       newHtml.Insert (match.Groups[1].Index, newHref);
    }

    Console.WriteLine (newHtml);
  }

  static string DBTranslate(string s)
  {
    return "junk_" + s;
  }
}

(OrderByDescending确保在修改StringBuilder时索引不会更改。)

答案 4 :(得分:0)

所以,你想要做的是根据匹配的内容生成替换字符串。考虑使用带有MatchEvaluatorRegex.Replace重载之一。例如:

static void Main()
{
  Regex r = new Regex(@"<a href=""[^""]+"">([^<]+)");

  string s0 = @"<p><a href=""docs/123.pdf"">33</a></p>";
  string s1 = r.Replace(s0, m => GetNewLink(m));

  Console.WriteLine(s1);
}

static string GetNewLink(Match m)
{
  return string.Format(@"(<a href=""{0}.html"">{0}", m.Groups[1]);
}

我实际上已经更进了一步并使用lambda expression而不是显式创建委托方法。