【问题标题】:NotePad++ Regular expression to remove HTML tag containing embedded tagsNotePad++ 正则表达式删除包含嵌入标签的 HTML 标签
【发布时间】:2015-10-11 14:25:39
【问题描述】:

使用 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>.`

我认为我需要的是这样的:
查找:&lt;span..&gt;(capture anything except "&lt;/span&gt;")&lt;/span&gt;
替换:\1

我不能使用([^&lt;])* 作为捕获组,因为跨度中有其他标签,例如示例中的&lt;b&gt;

我不能使用&lt;span class=\"temp\"&gt;(.*)&lt;/span&gt;,因为一行可能有两个这样的。

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

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

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

【问题讨论】:

  • 使用任何 xml 解析器怎么样?
  • 检查我的答案。它会帮助你。
  • 您需要保留其他标签并删除&lt;span&gt;吗?我不清楚
  • 是的。我特别需要删除某个类的跨度标签并保留所有其他标签。

标签: regex notepad++


【解决方案1】:

要删除ALL 标签,请使用:

发现什么:

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

替换为:

没什么




要删除 SPECIFIC 标签,请使用:

发现什么:

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

替换为:

没什么

【讨论】:

  • 您可以将&lt;.*?&gt;|&lt;/.*?&gt; 简化为&lt;/?.*?&gt;
【解决方案2】:

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

</?span[^>]*>

什么都没有。

【讨论】:

  • 几乎愚蠢的解决方案比几乎所有其他建议的答案都要好。
【解决方案3】:

改编路易斯科罗拉多的回答,这在我的情况下有效: &lt;span class="highlight3"&gt;(([^&lt;]|&lt;[^\/]|&lt;\/[^s]|&lt;\/s[^p]|&lt;\/sp[^a]|&lt;\/spa[^n]|&lt;\/span[^ \t&gt;])*)&lt;\/span&gt; $1 谢谢

【讨论】:

    【解决方案4】:

    通常,您不能使用正则表达式(意味着正确配对的标签)从 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++ 的特殊字符)

    编辑

    按照建议,如果您完全确定 &lt;span class="foo"&gt;...&lt;/span&gt; 中不包含其他标签,您可以使用此正则表达式:

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

    替换成

    $4
    

    正如demo 所示。

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

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

    并替换为

    $2
    

    demo所示。

    注2

    第一组括号 si 之所以如此复杂,是因为在元素属性中可能使用 &amp;lt;&amp;gt; 内的引号分隔符(有些是 xml 语法禁止的,必须用 &amp;lt;&amp;gt;,但并不是每个人都遵循这种方法。

    注3

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

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

    允许&lt;span&gt; 标签之间的任何内容,但另一个跨度标签。见demo。这次你也必须选择第 2 组

    $2
    

    【讨论】:

    • 就我而言,永远不会有一个跨度在另一个跨度内。
    猜你喜欢
    • 2011-04-16
    • 2015-10-05
    • 2019-11-25
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 2014-12-11
    相关资源
    最近更新 更多