用于删除 HTML 文档中特定标签内容的正则表达式(或替代方法)

Regex (or alternative method) to remove content of a specfic tag in a HTML document

我正在尝试构建一个 RegEx 字符串,用于在 sublime text 或 notepad++ 中查找和替换,以从 html 页面中删除删除线文本。一般来说,删除线的格式如下:

<span style="color: rgb(255,0,0);"><s>Some text here</s></span>

到目前为止,我想出了这个:

<span.*<s>.*<\/s><\/span>

但它不会停在第一个 </span>,它会继续,所以我选择了一大段文字。我查看了 regex wiki(和其他几个资源),我确定这是一个 "greedy matches" 问题,但我无法理解它应该是什么样子。

编辑:顺便说一下,如果有人有更好的解决方案来实现我所希望的效果,我还没准备好

限制贪婪匹配的最好方法是让它在特定字符处停止。 [abc] 是一个字符 class 表示 a、b、c 中的任何一个,而 [^abc] 表示除 a、b、c 之外的任何字符。所以 [^<] 不是 <.

的意思
<span[^>]*><s>[^<]*</s></span>

另一种(慢得多)方法是将 *+ 运算符设置为 return 最短匹配。在与 Perl 兼容的正则表达式中,您可以使用 *?+?.

为了扩展 dwks 的答案及其评论,如果删除线内有任何 HTML 标签,例如如果看起来像

<span><s>first <b>second</b> third</s></span>

那么它将与正则表达式不匹配

<span[^>]*><s>[^<]*</s></span>

因为此正则表达式不代表 <s></s> 之间的 <。在答案的末尾提到您可以使用 *?。为了完整起见,该正则表达式看起来像这样:

<span[^>]*><s>.*?<\/s><\/span>