NotePad ++正则表达式,用于删除包含嵌入标记的HTML标记

时间:2015-10-11 14:25:39

标签: regex notepad++

使用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>
    替换:\1

我无法将([^<])*用作捕获组,因为该范围中包含其他标记,例如示例中的<b>

我无法使用<span class=\"temp\">(.*)</span>因为在一行上可能有两个这样的人。

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

我发现有几个关于否定表达式的帖子,但无法让它们处理捕获组中的否定HTML标记。我的确切问题有一篇文章,但是在PHP而不是Notepad ++中。

我很感激任何建议。

4 个答案:

答案 0 :(得分:5)

要删除ALL代码,请使用:

找到什么:

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

替换:

NOTHING

enter image description here

要删除 SPECIFIC 标记,请使用:

找到什么:

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

替换:

NOTHING

enter image description here

答案 1 :(得分:2)

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

</?span[^>]*>

取而代之的。

答案 2 :(得分:0)

通常,您无法使用正则表达式(意味着正确配对的标记)从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语法旨在解析和验证(好吧,您不需要验证以正确选择文档的正确部分)XML文档,这些文档都具有相同的基本语法。这是推荐的选项(使用XMLParser解析它,然后使用XPath库找到确切的元素)

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

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

并用零替换它(谨防正确转义正确的字符,因为我不知道哪些是NotePad ++的特殊字符)

修改

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

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

并用

代替
$4

正如demo所示。

如果你想消除类鉴别器,只需使用:

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

并替换为

$2

如此demo所示。

注2

由于可能在元素属性中使用引号分隔符内的<>,因此第一组括号si中存在此类复杂性的原因(某些内容被xml语法禁止,必须使用&lt;&gt;,但不是每个人都遵循这种方法。

注3

经过一些测试,看到你的代码允许跨度标记之间的其他标记(不是span标记),我已将我的正则表达式更改为:

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

允许<span>个代码之间的任何内容,但允许另一个span标记。见demo。这次你还要选择第2组

$2

答案 3 :(得分:0)

改编Luis Colorado的答案,这适用于我的情况:     <span class="highlight3">(([^<]|<[^\/]|<\/[^s]|<\/s[^p]|<\/sp[^a]|<\/spa[^n]|<\/span[^ \t>])*)<\/span> $1     感谢

相关问题