我正在开发一个带有WYSIWYG编辑器的小型系统,该编辑器会吐出HTML。在生成的代码中,HTML链接看起来像这样。
<a href="{link:3645}">One line</a><br/>
<p>yada yaya</p>
<a href="{link:2780}" target="_blank">Another link</a>
我想“扫描”所有HTML,并将所有 Href值替换为我数据库中的网址。
这样的事情: - 对于{link:x}的每场比赛 - 在数据库中查找id x - 将{link:x}替换为数据库中的URL
当然,我正在看RegEX
但是无法真正弄清楚如何以最聪明的方式做到这一点。
关于链接的任何好主意?
干杯
答案 0 :(得分:3)
嗯,这是提取部分:
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main(string[] args)
{
string text = @"<a href=""{link:3645}"">One line</a><br/>
<p>yada yaya</p>
<a href=""{link:2780}"" target=""_blank"">Another link</a>";
Regex regex = new Regex(@"\{([^}]*)\}");
foreach (Match match in regex.Matches(text))
{
Console.WriteLine(match.Groups[1].Value);
}
}
}
版本替换链接:
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main(string[] args)
{
string text = @"<a href=""{link:3645}"">One line</a><br/>
<p>yada yaya</p>
<a href=""{link:2780}"" target=""_blank"">Another link</a>";
Regex regex = new Regex(@"\{link:([^}]*)\}");
text = regex.Replace(text, ConvertLink);
Console.WriteLine(text);
}
private static string ConvertLink(Match match)
{
// Put real logic in here :)
string link = match.Groups[1].Value;
return "http://converted/" + link + ".html";
}
}
请注意,此处的正则表达式稍微具体一些 - 它会强制link:
部分。你可能想要也可能不想要。
我会说在HTML中使用正则表达式并不是通常一个好主意 - 你应该考虑如果HTML本身的其余部分包含花括号会发生什么。在我们寻找“链接”的第二种形式中,这个问题稍微少一点,但它仍然不是很好......
答案 1 :(得分:3)
我认为最好使用Html Agility Pack 它允许你解析像LINQ到XML的HTML,你可以找到所有的href属性,并用你需要的值替换
并查看示例
HtmlDocument doc = new HtmlDocument();
doc.Load("file.htm");
foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a[@href"])
{
HtmlAttribute att = link["href"];
att.Value = FixLink(att);
}
doc.Save("file.htm");
在FixLink中,您可以设置正确的href值
或
HtmlWeb hw = new HtmlWeb();
HtmlDocument doc = hw.Load(txtLink.Text);
foreach(HtmlNode link in doc.DocumentNode.SelectNodes("//a[@href]"))
{
HtmlAttribute att = link["href"];
att.Value = FixLink(att);
}
答案 2 :(得分:1)
一种方法是在循环中使用以下正则表达式,直到找不到更多匹配项:
/href="\{link:(\d+)\}"/
找到匹配项后,$1
应包含链接ID。从DB获取链接并将其替换为href。