【问题标题】:A regular expression to remove a given (x)HTML tag from a string从字符串中删除给定 (x)HTML 标记的正则表达式
【发布时间】:2010-09-12 02:21:03
【问题描述】:

假设我有一个包含一堆文本和 (x)HTML 标记的字符串。我想删除给定标签的所有实例(以及该标签的任何属性),留下所有其他标签和文本。完成这项工作的最佳正则表达式是什么?

编辑添加:哦,我很欣赏使用正则表达式来解决这个特定问题并不是最好的解决方案。但是,为了讨论,我们是否可以假设该特定技术决策比我的薪酬等级高出几个级别? ;)

【问题讨论】:

    标签: html regex string


    【解决方案1】:

    虽然使用正则表达式解析 HTML 通常不受欢迎或被看不起,但您几乎肯定不想编写自己的解析器。

    但是,您可以使用一些内置或库函数来实现您的需要。

    • JavaScript 有getElementsByTagNamegetElementById,更不用说jQuery
    • PHP 具有 DOM 扩展名。
    • Python 有很棒的Beautiful Soup
    • ...等等。

    【讨论】:

      【解决方案2】:

      这是我为此目的编写的一个正则表达式,它适用于更多情况:

      </?(?(?=b|img|a|script)notag|[a-zA-Z0-9]+)(?:\s[a-zA-Z0-9\-]+=?(?:(["",']?).*?\1?)?)*\s*/?>
      

      【讨论】:

        【解决方案3】:

        正确答案:

        </?TAG\b[^>]*?>
        

        因为 Dans 的回答会删除 &lt;br /&gt;,但您只需要 &lt;b&gt;

        【讨论】:

          【解决方案4】:

          尝试使用正则表达式解析 HTML 通常是一个非常糟糕的主意。改用解析器,应该有一个可用于您选择的语言。

          可能能够摆脱这样的困境:

          </?tag[^>]*?>
          

          但这完全取决于你在做什么。例如,这不会删除标签的内容,并且可能会使您的 HTML 处于无效状态,具体取决于您要删除的标签。它还不能很好地处理无效的 HTML(还有很多这样的问题)。

          改用解析器:)

          【讨论】:

          • Dangit,不要用你明显正确的答案来为所有制作正则表达式的人带来乐趣!
          • 您需要将 * 设为非贪婪 (*?) 否则您将丢失字符串中从第一个匹配的标签到最后一个大于号的所有内容。
          【解决方案5】:

          我认为这里发生了一些严重的反正则表达式偏见。很多时候,当使用完整的解析器没有意义时,您可能希望从某些标记中去除特定标签。

          当然,有时解析器可能是最佳选择,但如果您正在寻找正则表达式,那么:

          <script[^>]*?>[\s\S]*?<\/script>
          

          这将删除脚本标签及其内容。确保使用不区分大小写的匹配。

          如果您不想删除标签的内容,那么您可以使用:

          <\/?script[^>]*?>
          

          在 javascript 中的使用示例如下:

          function stripScripts(markup) {
            return markup.replace(/<script[^>]*?>[\s\S]*?<\/script>/gi, '');
          }
          
          var safeText = stripScripts(textarea.value);
          

          【讨论】:

          • 嘿,正则表达式没什么问题,只是你不能在一个中编写一个 HTML 解析器(实际上,我认为你可以在 Perl 中(perl 有一些额外的正则表达式的东西),但是不维护它!)。
          • 我同意你的看法。有时您只想对具有已知结构的给定页面或由工具生成的具有明确定义的输出的 HTML 执行操作。当代码是可预测的时,使用正则表达式可能是有意义的。使用它们来解析人类输入的任何 HTML 风险更大! ;-)
          【解决方案6】:

          在我的脑海中,我想说这会让你朝着正确的方向开始。

          s/<TAG[^>]*>([^<]*)</TAG[^>]*>/\1
          

          基本上找到开始标签,标签之间的任何文本,然后是结束标签。用标签之间的内容替换整个内容。

          【讨论】:

            【解决方案7】:

            单个标签的出现方式太多了,更不用说编码、变体等了。
            我强烈建议你重新考虑这种方法……无论如何,你真的不应该直接处理 HTML。

            【讨论】:

              【解决方案8】:

              我想可能是 Raymond Chen (blogs.msdn.com/oldnewthing) 我在这里转述(糟糕!)...但是,您想要一个正则表达式? “现在你有两个问题” ... :=)

              如果字符串是格式良好的 (X)HTML,您能否将其加载到解析器 (HTML/XML) 中并使用它来删除任何有问题的节点?如果它的格式不正确,那么它会变得有点棘手,但是,我怀疑 RegEx 不是解决这个问题的最佳方法......

              【讨论】:

              • Raymond Chen 确实使用了该声明,但他引用了 Jaime Zawinski。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-11-05
              • 1970-01-01
              • 2015-04-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多