2011-04-18 2 views
0

Можно ли использовать регулярное выражение для удаления тегов HTML внутри определенного блока HTML?Удалить HTML с помощью Regex

E.g.

<body> 

<p>Hello World!</p> 

<table> 
    <tr> 
     <td> 
      <p>My First HTML Table</p> 
     </td> 
    </tr> 
</table> 

Я не хочу удалять все теги P, только те, что находятся внутри элемента таблицы.

Возможность удалять или сохранять текст внутри вложенного тега p будет идеальной.

Спасибо.

+0

Внутри конкретного блока HTML? Конечно. 's [

Моя первая таблица HTML

] [Моя первая таблица HTML]' - но для любого общего решения используйте настоящий синтаксический анализатор HTML. – Quentin

+4

Я должен направить вас к каноническому ответу на любой вопрос, связанный с HTML и регулярными выражениями: http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454# 1732454 –

+0

@ Андрей - конечно мой любимый ответ когда-либо - и я думаю, что любимый ответ на все SE :-) –

ответ

5

Есть много упоминаний о не использовать регулярные выражения при разборе HTML, так что вы можете использовать Html Agility Pack для этого:

var html = @" 
<body> 

<p>Hello World!</p> 

<table> 
    <tr> 
     <td> 
      <p>My First HTML Table</p> 
     </td> 
    </tr> 
</table>"; 

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

var nodes = document.DocumentNode.SelectNodes("//table//p"); 
foreach (HtmlNode node in nodes) 
{ 
    node.ParentNode.ReplaceChild(
     HtmlNode.CreateNode(node.InnerHtml), 
     node 
    ); 
} 

string result = null; 
using (StringWriter writer = new StringWriter()) 
{ 
    document.Save(writer); 
    result = writer.ToString(); 
} 

Таким образом, после всех этих manupulations, вы получите следующий result:

<body> 

<p>Hello World!</p> 

<table> 
    <tr> 
     <td> 
      My First HTML Table 
     </td> 
    </tr> 
</table></body> 
1
<td>[\r\n\s]*<p>([^<]*)</p>[\r\n\s]*</td> 

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

Однако использование регулярных выражений таким образом опирается на множество предположений относительно содержимого тега <p> и построения HTML.

Прочитайте вездесущий вопрос о том, что касается using regular expressions to parse (X)HTML и см. Ответ @ Bruno для более надежного решения.

1

Я нашел эту ссылку, в которой он, кажется, точный вопрос был задан

«У меня есть HTML-документ в формате .txt, содержащий несколько таблиц и других текстов, и я пытаюсь удалить любой HTML (что-нибудь в пределах» <> «), если он находится внутри таблицы (и между ними). ​​Например:»

Regex to delete HTML within <table> tags

0

Возможно в какой-то степени, но не надежно!

Я предпочел бы вам взглянуть на парсеры HTML, такие как HTML Agility Pack.

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