使用Regex替换特定的HTML标记

时间:2010-05-28 18:14:36

标签: c# html regex

好吧,对你们来说很简单。我们使用ActiveReport的RichTextBox来显示一些随机的HTML代码。

可以在此处找到ActiveReport支持的HTML标记:http://www.datadynamics.com/Help/ARNET3/ar3conSupportedHtmlTagsInRichText.html

我想要做的一个示例是将<div style="text-align:*</div>的所有匹配项替换为<p style=\"text-align:*</p>,以便使用支持的标记进行文本对齐。

我找到了以下正则表达式,以便在我的html输入中找到正确的匹配项:

<div style=\"text-align:(.*?)</div>

但是,我无法找到一种方法来在替换后保留标签中包含的先前文本。任何线索?是我还是Regex一般都是PITA? :)

    private static readonly IDictionary<string, string> _replaceMap =
        new Dictionary<string, string>
            {
                {"<div style=\"text-align:(.*?)</div>", "<p style=\"text-align:(.*?)</p>"}
            };

    public static string FormatHtml(string html)
    {
        foreach(var pair in _replaceMap)
        {
            html = Regex.Replace(html, pair.Key, pair.Value);
        }

        return html;
    }

谢谢!

2 个答案:

答案 0 :(得分:4)

使用$1

{"<div style=\"text-align:(.*?)</div>", "<p style=\"text-align:$1</p>"}

请注意,您可以将其简化为:

{"<div (style=\"text-align:(?:.*?))</div>", "<p $1</p>"}

使用像HtmlAgilityPack这样的HTML解析器通常比尝试使用正则表达式解析HTML更好。这是你如何做到的:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
foreach (var e in doc.DocumentNode.Descendants("div"))
    e.Name = "p";
doc.Save(Console.Out);

结果:

<p style="text-align:center">foo</p><p style="text-align:center">bar</p>

答案 1 :(得分:3)

您应该使用更适合解析和修改html的工具,而不是使用正则表达式。我会为此推荐Html Agility Pack - 它是为了满足您的需要而编写的。