【问题标题】:How to Remove HTML markup except for text completely outside every tag?除了完全在每个标签之外的文本,如何删除 HTML 标记?
【发布时间】:2011-03-07 18:57:45
【问题描述】:

我的情况是,我的 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”

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

【问题讨论】:

  • 不确定您的示例是否如您所愿?
  • 我认为您的示例需要重做。您似乎从他们那里丢失了 HTML 标记...
  • 如果它看起来像这样:abc&lt;div&gt;hi there&lt;/div&gt;cats are &gt; dogs?换句话说,您对杂散文本是否真的 HTML 有多少挑剔?

标签: html regex tags


【解决方案1】:

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

改为使用 XML 解析器。也许HtmlCleaner 会有所帮助?来自this answer,下面的代码 sn -p 说明了语法。

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

一旦您对可以选择各种 html sn-ps 感到满意,您就可以简单地从输入流中删除它们的内容,只留下周围的文本。

【讨论】:

    【解决方案2】:

    搜索

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

    并替换为

    $1 $2
    

    假设 HTML 文档之前或之后的文本从不包含 ,则应该这样做。如果这是一种可能性,事情会变得有点复杂。根据文件的内容,您可以删除从起始 HTML 标记或 doctype 一直到结束 HTML 标记的所有内容(忽略大小写):

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

    并替换为

    $1 $3
    

    【讨论】:

      【解决方案3】:

      我个人不会为此使用正则表达式。我不知道你是否有其他选择,但如果你可以将 HTML 片段加载到某种 DOM 中,那么你应该能够轻松地找到所有标签和子项并将它们删除。

      我看不到您的示例,但如果您确实有特殊情况,即您的外部文本始终位于文本的开头或结尾,那么这样的事情应该可以工作:

      ^(.*?)&lt;.*&gt;(.*?)$ 与第一个和第二个括号匹配您想要的文本。但是,如果您可以拥有

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

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

      【讨论】:

      • 不要忘记&lt;html&gt;&lt;body&gt;&lt;!-- tell them about ending the document with &lt;/html&gt; --&gt; &lt;p&gt;Hi, we're going to talk about HTML!&lt;/p&gt; ... &lt;/body&gt;&lt;/html&gt;,即使您确实匹配了标签。您需要正确解析 HTML,而这不能用正则表达式来完成。
      • 好点。我已经忘记了 cmets 等标签的噩梦。 :)
      猜你喜欢
      • 1970-01-01
      • 2020-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多