我处于这样一种情况,即我正在使用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”
任何方法或建议都将不胜感激。 谢谢
答案 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