2010-09-28 2 views
0

Каждый имеет регулярное выражение, которое может удалить атрибуты из тегаRegex удалить тег тела атрибуты (C#)

тела, например:

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

вернуться:

<body> 

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

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

вернуться:

<body bgcolor="White"> 
+0

Какой язык вы делаете это в? – t0mm13b

+5

[Использовать парсер.] (Http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454) – jball

+4

Обязательное сообщение обязательно: http: //stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – LittleBobbyTables

ответ

3

You can't parse XHTML with regex. Посмотрите на HTML Agility Pack.

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

HtmlNode body = doc.DocumentNode.SelectSingleNode("//body"); 
if (body != null) 
{ 
    body.Attributes.Remove("style"); 
} 
+0

Что делать, если блок html, на который я смотрю, не содержит тег body/node, будет ли это работать? Я только фильтрую определенный раздел страницы. – bcm

+0

@Brandon: SelectSingleNode возвращает 'null', если нет элемента body. – dtb

+0

сейчас .. это правильный ответ ... – bcm

0

LittleBobbyTables выше комментарий является правильным!

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

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

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

+0

Приведите пример HtmlAgilityPack, выполнив то, что я хочу? – bcm

+0

@Brandon: очевидно, вы не понимаете последствий регулярных выражений и не удосужились прочитать приведенные примеры, относящиеся к Html Agility Pack, вот ссылка для примера http://htmlagilitypack.codeplex.com/wikipage?title=Examples&referringTitle=Home – t0mm13b

+0

Я уже прочитал это, спасибо вам большое, и не нашел его полезным для моего сценария. – bcm

2

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

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

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

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

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

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

+0

Каким образом он мог вернуться, чтобы укусить его, если все, что он хочет сделать, это удалить непредсказуемые атрибуты? – MooGoo

+0

@Moogoo - см. Мой комментарий выше! – t0mm13b

+0

как использовать это в C#? – bcm

0

Вот как вы могли бы сделать это в 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 и является бета-версия продукта ... но я хотел доказать, что вы могли бы сделать это таким образом.

2

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

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); 
0
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

Коренастый код у меня работает в данный момент, будет смотреть на снижение этого:

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

это для Справка. – bcm

+0

код очень улучшен/уменьшен, ссылка здесь: http://stackoverflow.com/questions/3818404/how-to-select-node-types-which-are-htmlnodetype-comment-using-htmlagilitypack/3828478#3828478 – bcm

Смежные вопросы