RegEx替换大括号内的内容

时间:2011-09-23 05:24:58

标签: c# html regex

我正在开发一个带有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但是无法真正弄清楚如何以最聪明的方式做到这一点。

关于链接的任何好主意?

干杯

3 个答案:

答案 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。