如何删除HTML标记除了文本完全在每个标记之外?

时间:2010-06-24 12:11:31

标签: html regex tags

我处于这样一种情况,即我正在使用HTML标记,其中包含一些文本(前导或尾随)。我应该使用什么正则表达式?例如:

some text over here
<Html>
<Title>website</Title>
<Body>
text text text
<Div>xxxxx</Div>
</Body>
</Html>
ending text

所以,我应该只获得“一些文本在这里”和“结束文本”....每个标签内的所有html +文本都不应该被扣除。

另一个例子:

abcdef<div>xyz</div>

它应该返回“abcdef”

任何方法或建议都将不胜感激。 谢谢

3 个答案:

答案 0 :(得分:2)

我个人不会使用正则表达式。我不知道你是否可以有替代方案,但是如果你可以将HTML片段加载到某种DOM中,那么你应该能够轻松地找到所有标签和子节点并将其剥离。

我看不到您的示例,但如果您确实遇到外部文本始终位于文本开头或结尾的特殊情况,那么此类内容应该有效:

带有第一个和第二个括号的

^(.*?)<.*>(.*?)$与您想要的文字相匹配。但是,如果你可以

text<b>HTML</b>text<b>HTML</b>text

当然,对于希望输出为“texttexttext”的多重嵌套HTML的更糟糕的情况,我认为正则表达式可能非常复杂。

答案 1 :(得分:1)

Don't use regex to parse (X)HTML!

相反,请使用XML解析器。或许HtmlCleaner会有所帮助吗?从this answer开始,以下代码段说明了语法。

TagNode root = htmlCleaner.clean( stream );
Object[] found = root.evaluateXPath( "//div[id='something']" );
if( found.length > 0 && found instanceof TagNode ) {
    ((TagNode)found[0]).removeFromTree();
}

如果您对可以选择各种html代码段感到满意,那么您只需从输入流中删除其内容,只留下周围的文字。

答案 2 :(得分:0)

搜索

(.*?)<.*>(.*?)

并替换为

$1 $2

假设HTML文档之前或之后的文本从不包含&lt;或者&gt;。如果这是可能的,事情会变得复杂一些。根据文件的内容,您可以删除从起始HTML标记或doctype到结束HTML标记的所有内容(忽略大小写):

(.*?)<(doctype|html).*</html>(.*?)

并替换为

$1 $3