Замена определенных тегов HTML с помощью Regex - PullRequest
2 голосов
/ 28 мая 2010

Хорошо, легко для вас, ребята. Мы используем ActiveReport RichTextBox для отображения некоторых случайных битов HTML-кода.

Теги HTML, поддерживаемые ActiveReport, можно найти здесь: 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 ]

4 голосов
/ 28 мая 2010

Использование $1:

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

Обратите внимание, что вы можете упростить это до:

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

Также, как правило, лучше использовать анализатор HTML, например HtmlAgilityPack , чем пытаться анализировать 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>
3 голосов
/ 28 мая 2010

Вместо использования регулярных выражений вы должны использовать инструмент, который больше подходит для анализа и изменения HTML. Я бы порекомендовал Html Agility Pack для этого - он был написан, чтобы делать именно то, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...