NotePad++ 正则表达式删除包含嵌入标签的 HTML 标签

NotePad++ Regular expression to remove HTML tag containing embedded tags

使用 Notepad++,技术作家部门需要从这样的文本中删除 <span class..>xxx</span> 标签:

`<span class="temp">See</span> Problems pane <span class="temp">for more <b>information</b>.</span>`

(澄清:) 期望的结果是没有 span 标签的元素的内部文本。上述示例的输出为:

 `See Problems pane for more <b>information</b>.`

我认为我需要的是这样的:
查找:<span..>(capture anything except "</span>")</span>
替换:</code></p> <p>我无法使用 <code>([^<])* 作为捕获组,因为跨度中有其他标记,例如示例中的 <b>

我不能使用<span class=\"temp\">(.*)</span>,因为一条线上可能有两个这样的。

我尝试使用非贪婪语法关闭整个标记并使用我在其他 post 中找到的示例计算 {1} 语法,但我无法让它工作。

我在否定表达式上找到了几个 post,但无法让它们在捕获组中的否定 HTML 标记上工作。我的确切问题有一个 post,但在 PHP 而不是 Notepad++ 中。

如有任何建议,我将不胜感激。

要删除 ALL 标签,请使用:

查找内容:

<.*?>|</.*?>

替换为:

没有




要删除 SPECIFIC 标签,请使用:

查找内容:

<(span|othertag).*?>|</(span|othertag)>

替换为:

没有

通常,您不能使用正则表达式(意味着正确配对的标签)从 XML 或 HTML 文档中删除完整元素,因为 XML 和 HTML是常规语言(它们是上下文无关的)。如果你尝试,你可以得到这个场景:

<div something="bla bla">
   <someothertag> bla bla </someothertag>
   <div something="foo bar">  <!-- this tag will give you problems -->
         other text
   </div>  <!-- we have to match up to here? (wrong!) -->
</div>  <!-- or here? (right!) -->

常规语言是无法计算能够输入的左大括号数量的语言,直到 正确匹配 右大括号。为此,您必须使用无上下文语法的解析器。这就是这里有些人建议您使用 XML 解析器来完成任务的原因。 XML 语法旨在解析和验证(好吧,您不需要验证正确 select 文档的正确部分) XML 文档,它们都共享相同的基本语法.这是推荐的选项(使用 XMLParser 对其进行解析,然后使用 XPath 库定位确切的元素)

另一方面,如果您只想让 HTML 文档标签自由(以消除上面的所有标签),您可以这样做,因为定义一个标签的语法是常规的。您可以搜索此图案:

<([^>"']|"[^"]*"|'[^']*')>

并用任何东西替换它(注意正确转义正确的字符,因为我不知道哪些是 NotePad++ 的特殊字符)

编辑

如建议的那样,如果您完全确定 <span class="foo">...</span> 中没有其他标签,您可以使用此正则表达式:

<span[ \t]+([^>"']|"[^"]*"|'[^']*'|\n)*(\bclass="foo")([^>"']|"[^"]*"|'[^']*'|\n)*>([^<]*)<\/span>

并将其替换为


如此 demo 所示。

如果要消除 class 鉴别器,只需使用:

<span\b([^>"']|"[^"]*"|'[^']*'|\n)*>([^<]*)<\/span>

并替换为


如图demo.

注2

第一组括号 si 如此复杂的原因是可能在元素属性中使用 <> 引号分隔符(有些被 xml 禁止)语法并且必须使用 &lt;&gt; 进行转义,但并不是每个人都遵循这种方法。

注释 3

经过一些测试,发现您的代码允许在跨度标记之间使用其他标签(不是跨度标签),我已将我的正则表达式更改为:

<span\b([^>"']|"[^"]*"|'[^']*'|\n)*>(([^<]|<[^\/]|<\/[^s]|<\/s[^p]|<\/sp[^a]|<\/spa[^n]|<\/span[^ \t>])*)<\/span>

允许 <span> 标签之间的任何内容,但另一个 span 标签。参见 demo。这次你还要select组2也


采用 Luis Colorado 的回答,这对我来说很有效: <span class="highlight3">(([^<]|<[^\/]|<\/[^s]|<\/s[^p]|<\/sp[^a]|<\/spa[^n]|<\/span[^ \t>])*)<\/span> 谢谢

这似乎是一个更简单的解决方案:

</?span[^>]*>

什么都没有替换。