C# 正则表达式替换卷曲brakets中的内容
我正在开发一个带有所见即所得编辑器的小型系统,该编辑器可以输出HTML。在生成的代码中,HTML链接如下所示C# 正则表达式替换卷曲brakets中的内容,c#,html,regex,C#,Html,Regex,我正在开发一个带有所见即所得编辑器的小型系统,该编辑器可以输出HTML。在生成的代码中,HTML链接如下所示 <a href="{link:3645}">One line</a><br/> <p>yada yaya</p> <a href="{link:2780}" target="_blank">Another link</a> 雅达雅雅 我想“扫描”所有HTML,并用数据库中的URL替换所有Href值
<a href="{link:3645}">One line</a><br/>
<p>yada yaya</p>
<a href="{link:2780}" target="_blank">Another link</a>
雅达雅雅
我想“扫描”所有HTML,并用数据库中的URL替换所有Href值
大概是这样的:
-对于{link:x}的每个匹配
-在数据库中查找id x
-用数据库中的URL替换{link:x}
当然,我在看RegEX
,但我真的不知道如何用最聪明的方式来做这件事
关于链接有什么好主意吗
干杯好吧,这里是提取部分:
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);
}
}
}
使用系统;
使用System.Text.RegularExpressions;
班级计划
{
静态void Main(字符串[]参数)
{
字符串文本=@“
雅达雅雅
";
Regex Regex=newregex(@“\{([^}]*)\}”);
foreach(regex.Matches中的匹配(文本))
{
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";
}
}
使用系统;
使用System.Text.RegularExpressions;
班级计划
{
静态void Main(字符串[]参数)
{
字符串文本=@“
雅达雅雅
";
Regex Regex=newregex(@“\{link:([^}]*)\}”);
text=regex.Replace(text,ConvertLink);
控制台写入线(文本);
}
专用静态字符串转换链接(匹配)
{
//把真正的逻辑放在这里:)
字符串链接=匹配。组[1]。值;
返回“http://converted/“+link+”.html”;
}
}
注意,这里的正则表达式稍微更为具体—它强制使用链接:
部分。你可能想要,也可能不想要
<>我会说,在HTML中使用正则表达式不是一个好主意——你应该考虑如果HTML本身的其余部分包含花键的话会发生什么。在第二种形式中,我们寻找“链接”时,问题稍微小一些,但仍然不太好…我认为最好使用
它允许您将像LINQ这样的html解析为XML,您可以找到所有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的正确值的函数
或
一种方法是在循环中使用以下正则表达式,直到找不到进一步的匹配:
/href="\{link:(\d+)\}"/
当找到匹配项时,
$1
应该包含链接ID。从DB获取链接并用href替换它。我听说你应该避免HTML上的正则表达式,但是有没有其他更好的方法来解决这个问题?如果你使用像这样的lookbehind断言new RegEx(@)会更好一些(?@stema:有什么理由不把它放在大括号之前,而把它放在大括号之前,而把它放在一个组中?(就像开头和结尾的大括号一样。)@JonSkeet这是一个长度为零的断言,这意味着它将不匹配。您可以确保此部分在您要替换的内容之前,而不必也替换它。@stema:啊,我明白了。Doh,是的。当然,另一种选择是在替换文本中包含href=)我猜这就是如何将字符串加载到文档中而不是文件:HtmlWeb hw=new HtmlWeb();HtmlDocument doc=hw.load(txtLink.Text);
是的,您可以从字符串或文件加载html
/href="\{link:(\d+)\}"/