使用 < 和 > 对代码进行编码时,正则表达式匹配除 HTML 标记之外的任何内容

Posted

技术标签:

【中文标题】使用 < 和 > 对代码进行编码时,正则表达式匹配除 HTML 标记之外的任何内容【英文标题】:Regex to match anything except HTML tags when code is encoded using &lt; and &gt; 【发布时间】:2022-01-03 16:28:56 【问题描述】:

我正在尝试使用正则表达式来匹配除 html 标记之外的任何文本。我为“普通”HTML 代码找到了这个解决方案:

<[^>]*>(*SKIP)(*F)|[^<]+

但是,我的代码是使用 &amp;lt;&amp;gt; 而不是 &lt;&gt; 编码的,并且我无法修改上面的正则表达式以使其正常工作。

举个例子,给定文字:

Hi &amp;lt;p class=\"hello\"&amp;gt;\r\nthere, how are you\r\n&amp;lt;/p&amp;gt;

我需要匹配“嗨”和“那里,你好吗”。请注意,在此示例中,我还需要匹配不在标签之间的文本“hi”。

更新:因为我使用的是 ruby​​ 的 gsub,看起来我什至不能使用 *SKIP 和 *F

更新 2:我试图不涉及太多细节,但似乎很重要: 我实际上需要替换文本中的所有空格,而不是那些属于标记的空格,无论是&amp;lt; ... &amp;gt; 标记还是&lt;...&gt; 标记。

【问题讨论】:

你能用(?s)&amp;lt;.*?&amp;gt;运行正则表达式拆分吗? 可能是&amp;lt;(?:(?!&amp;gt;)[\s\S])*&amp;gt;(*SKIP)(*F)|(?:(?!&amp;lt;)[\s\S])+regex101.com/r/TjrIOo/1 @WiktorStribiżew 我是个好主意,我可以使用 split 但我需要重建文本,我使用的是 ruby​​ 的 gsub 并且使用 split 我会丢失标签的内容 @Thefourthbird 哦,效果很好!但我刚刚尝试过,看起来 ruby​​ (1.9.3) 不支持 *SKIP 和 *FAIL ...我要更新问题 太完美了!!!可能是这样它适用于两者 < >和 标签?我将在描述中更详细地解释这个问题,您可以将此作为答案发布,以便我选择它作为解决方案。你刚刚救了我的头,非常感谢你,我会“买咖啡”-ing你 【参考方案1】:

你可以使用

text = text.gsub(/(&lt;.*?&gt;|<[^>]*>)|[[:blank:]]/m)  $1 || '_' 

我建议使用[[:blank:]] 而不是\s,因为我假设您不想替换换行符。请参阅Ruby demo。

上面的正则表达式匹配

(&amp;lt;.*?&amp;gt;|&lt;[^&gt;]*&gt;) - &amp;lt;,尽可能少的零个或多个字符,以及&amp;gt;&lt;,然后是除&gt; 之外的零个或多个字符,然后是&gt; | - 或 [[:blank:]] - 任何单个水平空格(您也可以使用 [\pZs\t] 匹配任何 Unicode 水平空格)。

替换中的 $1 || '_' 块表示当Group 1匹配时,Group 1值按原样返回,否则_作为水平空白的替换返回。

【讨论】:

以上是关于使用 < 和 > 对代码进行编码时,正则表达式匹配除 HTML 标记之外的任何内容的主要内容,如果未能解决你的问题,请参考以下文章

怎样用jquery编码和解码url

使用apache-commons-lang3框架,对html内容进行编码和反编码

使用apache-commons-lang3架构对HTML内容进行编码和反编码

您将如何使用协议缓冲区对 Map<String, Object> 进行编码?

JavaScript性能优化

HTML 的实体编码(HTML Entity Encode)