Matthew Perron
Matthew Perron

Reputation: 6291

Replacing specific HTML tags using Regex

Alright, an easy one for you guys. We are using ActiveReport's RichTextBox to display some random bits of HTML code.

The HTML tags supported by ActiveReport can be found here : http://www.datadynamics.com/Help/ARNET3/ar3conSupportedHtmlTagsInRichText.html

An example of what I want to do is replace any match of <div style="text-align:*</div> by <p style=\"text-align:*</p> in order to use a supported tag for text-alignment.

I have found the following regex expression to find the correct match in my html input:

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

However, I can't find a way to keep the previous text contained in the tags after my replacement. Any clue? Is it me or Regex are generally a 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;
    }

Thanks!

Upvotes: 2

Views: 3719

Answers (2)

Mark Byers
Mark Byers

Reputation: 839144

Use $1:

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

Note that you could simplify this to:

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

Also it is generally a better idea to use an HTML parser like HtmlAgilityPack than trying to parse HTML using regular expressions. Here's how you could do it:

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

Result:

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

Upvotes: 4

Rune Grimstad
Rune Grimstad

Reputation: 36340

Instead of using regex'es you should use a tool that is more suited to parse and modify html. I would recommend the Html Agility Pack for this - it was written to do just what you need.

Upvotes: 3

Related Questions