使用 < 和 > 对代码进行编码时,正则表达式匹配除 HTML 标记之外的任何内容
Posted
技术标签:
【中文标题】使用 < 和 > 对代码进行编码时,正则表达式匹配除 HTML 标记之外的任何内容【英文标题】:Regex to match anything except HTML tags when code is encoded using < and > 【发布时间】:2022-01-03 16:28:56 【问题描述】:我正在尝试使用正则表达式来匹配除 html 标记之外的任何文本。我为“普通”HTML 代码找到了这个解决方案:
<[^>]*>(*SKIP)(*F)|[^<]+
但是,我的代码是使用 &lt;
和 &gt;
而不是 <
和 >
编码的,并且我无法修改上面的正则表达式以使其正常工作。
举个例子,给定文字:
Hi &lt;p class=\"hello\"&gt;\r\nthere, how are you\r\n&lt;/p&gt;
我需要匹配“嗨”和“那里,你好吗”。请注意,在此示例中,我还需要匹配不在标签之间的文本“hi”。
更新:因为我使用的是 ruby 的 gsub,看起来我什至不能使用 *SKIP 和 *F
更新 2:我试图不涉及太多细节,但似乎很重要:
我实际上需要替换文本中的所有空格,而不是那些属于标记的空格,无论是&lt; ... &gt;
标记还是<...>
标记。
【问题讨论】:
你能用(?s)&lt;.*?&gt;
运行正则表达式拆分吗?
可能是&lt;(?:(?!&gt;)[\s\S])*&gt;(*SKIP)(*F)|(?:(?!&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(/(<.*?>|<[^>]*>)|[[:blank:]]/m) $1 || '_'
我建议使用[[:blank:]]
而不是\s
,因为我假设您不想替换换行符。请参阅Ruby demo。
上面的正则表达式匹配
(&lt;.*?&gt;|<[^>]*>)
- &lt;
,尽可能少的零个或多个字符,以及&gt;
或<
,然后是除>
之外的零个或多个字符,然后是>
|
- 或
[[:blank:]]
- 任何单个水平空格(您也可以使用 [\pZs\t]
匹配任何 Unicode 水平空格)。
替换中的 $1 || '_'
块表示当Group 1匹配时,Group 1值按原样返回,否则_
作为水平空白的替换返回。
【讨论】:
以上是关于使用 < 和 > 对代码进行编码时,正则表达式匹配除 HTML 标记之外的任何内容的主要内容,如果未能解决你的问题,请参考以下文章
使用apache-commons-lang3框架,对html内容进行编码和反编码
使用apache-commons-lang3架构对HTML内容进行编码和反编码