我有一块看起来像这样的html;
<p><a href="docs/123.pdf">33</a></p>
基本上有数百个锚链接我需要根据锚文本替换href。例如,我需要用以下内容替换上面的链接
<a href="33.html">33</a>.
我需要取值33并在我的数据库上查找以找到用href替换href的新链接。
我需要将其全部保存在上面的原始html中!
我该怎么做?救命啊!
答案 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)
所以,你想要做的是根据匹配的内容生成替换字符串。考虑使用带有MatchEvaluator的Regex.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而不是显式创建委托方法。