【问题标题】:Javascript replace tag but preserve contentJavascript替换标签但保留内容
【发布时间】:2014-10-12 11:38:40
【问题描述】:

假设我有这样的文字:

This should also be extracted, <strong>text</strong>

我只需要整个字符串中的text,我试过这个:

r = r.replace(/<strong[\s\S]*?>[\s\S]*?<\/strong>/g, "$1"); 但失败了(strong 仍然存在)。有什么合适的方法吗?

预期结果

This should also be extracted, text

解决方案:

为了定位特定标签,我使用了这个:

r = r.replace(/<strong\b[^>]*>([^<>]*)<\/strong>/i, "**$1**")

【问题讨论】:

    标签: javascript regex tags


    【解决方案1】:

    要解析 HTML,您需要一个 HTML 解析器。请参阅this answer 了解原因。

    如果您只想从文本中删除<strong></strong>,则不需要解析,但当然简单的解决方案往往会失败,这就是您需要HTML 解析器来解析HTML 的原因。这是一个删除<strong></strong> 的简单解决方案:

    str = str.replace(/<\/?strong>/g, "")
    

    var yourString = "This should also be extracted, <strong>text</strong>";
    yourString = yourString.replace(/<\/?strong>/g, "")
    display(yourString);
    
    function display(msg) {
      // Show a message, making sure any HTML tags show
      // as text
      var p = document.createElement('p');
      p.innerHTML = msg.replace(/&/g, "&amp;").replace(/</g, "&lt;");
      document.body.appendChild(p);
    }

    回到解析:在您的情况下,如果您在浏览器上,您可以使用浏览器的解析器轻松完成:

    var yourString = "This should also be extracted, <strong>text</strong>";
    var div = document.createElement('div');
    div.innerHTML = yourString;
    display(div.innerText || div.textContent);
    
    function display(msg) {
      // Show a message, making sure any HTML tags show
      // as text
      var p = document.createElement('p');
      p.innerHTML = msg.replace(/&/g, "&amp;").replace(/</g, "&lt;");
      document.body.appendChild(p);
    }

    大部分浏览器都提供innerText; Firefox 提供了textContent,这就是为什么那里有||

    在非浏览器环境中,您需要某种 DOM 库(有很多)。

    【讨论】:

    • 我没有解析 html,我只需要稍后在文本文档中显示的没有 标签的文本
    • @T.J.Crowder - 对 :-) 我没看到!
    • @user2002495:要可靠地获取 HTML 标记中的内容,您必须解析 HTML。就这么简单。尝试使用简单化规则失败。
    • 谢谢大家的回答,最后我自己解决了,但你的回答似乎很有启发性
    • @user2002495:FWIW,仅适用于 strong 并且没有属性(基于您在其他地方的 cmets),我确实添加了一个正则表达式示例。
    【解决方案2】:

    你可以这样做

    var r = "This should also be extracted, <strong>text</strong>";
    r = r.replace(/<(.+?)>([^<]+)<\/\1>/,"$2");
    console.log(r);
    

    我刚刚包含了一些严格的正则表达式。但是如果你想要轻松的版本,你可以做得很好

    r = r.replace(/<.+?>/g,"");
    

    【讨论】:

    • 谢谢,您的代码是否可以仅在强标签上使用正则表达式?
    • 谢谢,查看解决方案,我只能定位特定标签
    • @user2002495 不要忘记接受任何对您有最大帮助的答案
    • 这当然会失败,&lt;strong data-attr="hey look: &gt; "&gt;text&lt;/strong&gt; 因此需要解析。
    • 我不需要检查属性,因为基本上我在一个不可编辑的 iframe 中控制整个 DOM 元素本身,我只需要能够做我想做的事
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-30
    • 2013-12-07
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    • 1970-01-01
    相关资源
    最近更新 更多