C# 正则表达式替换卷曲brakets中的内容

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值

我正在开发一个带有所见即所得编辑器的小型系统,该编辑器可以输出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值

大概是这样的: -对于{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+)\}"/