用于删除 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>
我正在尝试构建一个 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>