Regex для удаления атрибутов тега body (C #) - PullRequest
0 голосов
/ 29 сентября 2010

У любого есть регулярное выражение, которое может удалить атрибуты из тега body

например:

<body bgcolor="White" style="font-family:sans-serif;font-size:10pt;">

чтобы вернуть:

<body>

Было бы также интересно увидеть пример удаления только определенного атрибута, например:

<body bgcolor="White" style="font-family:sans-serif;font-size:10pt;">

чтобы вернуть:

<body bgcolor="White">

Ответы [ 7 ]

3 голосов
/ 29 сентября 2010

Вы не можете разобрать XHTML с регулярным выражением .Взгляните на HTML Agility Pack .

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);

HtmlNode body = doc.DocumentNode.SelectSingleNode("//body");
if (body != null)
{
    body.Attributes.Remove("style");
}
2 голосов
/ 29 сентября 2010

Три способа сделать это с помощью регулярных выражений ...

string html = "<body bgcolor=\"White\" style=\"font-family:sans-serif;font-size:10pt;\">";
string a1 = Regex.Replace(html, @"(?<=<body\b).*?(?=>)", "");
string a2 = Regex.Replace(html, @"<(body)\b.*?>", "<$1>");
string a3 = Regex.Replace(html, @"<(body)(\s[^>]*)?>", "<$1>");
Console.WriteLine(a1);
Console.WriteLine(a2);
Console.WriteLine(a3);
2 голосов
/ 29 сентября 2010

Если вы делаете быстрый и грязный сценарий оболочки, и вы не планируете использовать это много ...

s/<body [^>]*>/<body>/

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

и удалитьконкретный атрибут:

s/\(<body [^>]*\) style="[^>"]*"/\1/

Он будет захватывать «тело» и любые атрибуты вплоть до «стиля», удалять атрибут «стиля» и выплевывать остальные.

0 голосов
/ 29 сентября 2010

Короче код, который я сейчас работаю, будет стремиться уменьшить это:

private static string SimpleHtmlCleanup(string html)
        {
            HtmlDocument doc = new HtmlDocument();
            doc.LoadHtml(html);

            //foreach(HtmlNode nodebody in doc.DocumentNode.SelectNodes("//a[@href]"))

            var bodyNodes = doc.DocumentNode.SelectNodes("//body");
            if (bodyNodes != null)
            {
                foreach (HtmlNode nodeBody in bodyNodes)
                {
                    nodeBody.Attributes.Remove("style"); 
                }
            }

            var scriptNodes = doc.DocumentNode.SelectNodes("//script");
            if (scriptNodes != null)
            {
                foreach (HtmlNode nodeScript in scriptNodes)
                {
                    nodeScript.Remove();
                }
            }

            var linkNodes = doc.DocumentNode.SelectNodes("//link");
            if (linkNodes != null)
            {
                foreach (HtmlNode nodeLink in linkNodes)
                {
                    nodeLink.Remove();
                }
            }

            var xmlNodes = doc.DocumentNode.SelectNodes("//xml");
            if (xmlNodes != null)
            {
                foreach (HtmlNode nodeXml in xmlNodes)
                {
                    nodeXml.Remove();
                }
            }

            var styleNodes = doc.DocumentNode.SelectNodes("//style");
            if (styleNodes != null)
            {
                foreach (HtmlNode nodeStyle in styleNodes)
                {
                    nodeStyle.Remove();
                }
            }

            var metaNodes = doc.DocumentNode.SelectNodes("//meta");
            if (metaNodes != null)
            {
                foreach (HtmlNode nodeMeta in metaNodes)
                {
                    nodeMeta.Remove();
                }
            }

            var result = doc.DocumentNode.OuterHtml;

            return result;
        }
0 голосов
/ 29 сентября 2010
string pattern = @"<body[^>]*>";
string test = @"<body bgcolor=""White"" style=""font-family:sans-serif;font-size:10pt;"">";
string result = Regex.Replace(test,pattern,"<body>",RegexOptions.IgnoreCase);
Console.WriteLine("{0}",result);
string pattern2 = @"(?<=<body[^>]*)\s*style=""[^""]*""(?=[^>]*>)";
result = Regex.Replace(test, pattern2, "", RegexOptions.IgnoreCase);
Console.WriteLine("{0}",result);

Это на тот случай, если требования вашего проекта ограничивают возможности сторонних разработчиков (и не дают вам времени на переизобретение парсера).

0 голосов
/ 29 сентября 2010

Вот как вы это сделаете в SharpQuery

string html = "<body bgcolor=\"White\" style=\"font-family:sans-serif;font-size:10pt;\">";
var sq = SharpQuery.Load(html);
var body = sq.Find("body").Single();
foreach (var a in body.Attributes.ToArray())
    a.Remove();
StringWriter sw = new StringWriter();
body.OwnerDocument.Save(sw);
Console.WriteLine(sw.ToString());

Это зависит от HtmlAgilityPack и является бета-продуктом ... но я хотел доказать, что вы могли бы сделать это такспособ.

0 голосов
/ 29 сентября 2010

Комментарий LittleBobbyTables выше верен!

Regex - не тот инструмент, если вы читаете его, это действительно так. Использование регулярных выражений для такого рода вещей поразит вас чрезмерным напряжением и стрессом, поскольку ответ, ясно показанный по той ссылке, опубликованной LittleBobbyTables, что ответчик опыт в результате использования неправильного инструмента для неправильной работы.

Regex - это НЕ клейкая лента для подобных вещей, и не является ответом на все вопросы, включая 42 ... , используйте правильный инструмент для правильной работы

Однако вы должны проверить HtmlAgilityPack , который сделает за вас работу и в конечном итоге избавит вас от стресса, слез и крови в результате попадания в тиски смерти с помощью регулярных выражений для анализа html .. .

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