2011-04-18 106 views
0

是否可以使用正则表达式来删除特定HTML块内的HTML标记?使用正则表达式删除HTML

E.g.

<body> 

<p>Hello World!</p> 

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

我不想删除所有P标签,只有那些在表格元素中的标签。

同时删除或保留嵌套p标签内的文本的能力将是理想的。

谢谢。

+0

在一个特定的HTML块内?当然。 [

我的第一个HTML表格

] [我的第一个HTML表] - 但对于任何一般的解决方案,请使用真正的HTML解析器。 – Quentin 2011-04-18 10:10:32

+4

我必须向您提及涉及HTML和正则表达式的任何问题的规范答案:http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454# 1732454 – 2011-04-18 10:12:58

+0

@Andrew - 当然是我最喜欢的回答 - 我想所有的SE最喜欢的答案:-) – 2011-04-18 10:19:51

回答

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的无处不在的SO问题,并参阅@ Bruno对更强大解决方案的回答。

1

我发现这个链接中,它似乎确切有人问

“我有一个包含在.txt格式的HTML文档的多个表和其他文本,我想内删除任何HTML(任何” <>“),如果它是一个表内(之间),例如:”

Regex to delete HTML within <table> tags

0

可能在一定程度上,但不可靠的!

我宁愿建议你看看HTML解析器,如HTML Agility Pack