【问题标题】:Replace substring between two substrings [duplicate]替换两个子字符串之间的子字符串[重复]
【发布时间】:2021-02-11 14:15:44
【问题描述】:

请考虑以下示例:

let string = '<h2>Some content here</h2><p>Foo Bar</p><h2>Different content here</h2>'

我想替换 &lt;h2&gt;&lt;/h2&gt; 之间的内容。

我尝试了以下方法:

string.replace(/<h2.*<\/h2>/, '<h2>xxyyzz</h2>');

但上述解决方案将string 转换为:

<h2>xxyyzz</h2>

预期结果:

'<h2>xxyyzz</h2><p>Foo Bar</p><h2>xxyyzz</h2>'

如何替换所有出现的两个子字符串之间的内容?

【问题讨论】:

  • 您是否有理由不使用 DOM API 进行这些更改?默认情况下,量词是 greedy,即它们匹配 longest 子字符串。
  • @FelixKling 是的,算法会在服务器端运行,客户端不能做是有原因的。
  • Node.js 也有 HTML 解析器。只是需要考虑的事情,具体取决于输入的实际复杂程度。

标签: javascript html regex


【解决方案1】:

其中一种方法是调整您的正则表达式:

let string = '<h2>Some content here</h2><p>Foo Bar</p><h2>Different content here</h2>';
string = string.replace(/<h2>(.*?)<\/h2>/gm, '<h2>xxyyzz</h2>');
console.log(string); // <h2>xxyyzz</h2><p>Foo Bar</p><h2>xxyyzz</h2>

一些细节/限制:

  • 标签区分大小写;
  • g 修饰符:全局。所有匹配(第一次匹配后不返回);
  • m 修饰符:多行。使 ^ 和 $ 匹配每行的开始/结束(不仅是字符串的开始/结束);

类似的问题: Regex select all text between tags

【讨论】:

    【解决方案2】:

    let string = '<h2>Some content here</h2><p>Foo Bar</p><h2>Different content here</h2>'
    string = string.replace(/<h2>[\s\S]*?<\/h2>/g, '<h2>ABCDEF<\/h2>');
    console.log(string);

    纯 javascript 替代品

    let string = '<h2>Some content here</h2><p>Foo Bar</p><h2>Different content here</h2>'
    let tmpele = document.createElement('div');
    tmpele.innerHTML = string;
    
    let hs = tmpele.getElementsByTagName('h2');
    for(let i = 0;i < hs.length; i++) {
        hs[i].innerHTML = 'ABCDEF'
    }
    console.log(tmpele.innerHTML);

    【讨论】:

    • 我相信如果您解释一下您所做的更改以及更改的原因,人们会发现它很有帮助。
    【解决方案3】:

    您的正则表达式也包括Foo bar 部分。

    您需要更新您的正则表达式,例如。

    let string = '<h2>Some content here</h2><p>Foo Bar</p><h2>Different content here</h2>';
    
    alert(string.replace(/<h2>[^<]+<\/h2>/g, '<h2>xxyyzz</h2>'));

    【讨论】:

    • 可能值得一提的是,这只有在标题内没有其他标签时才有效。
    猜你喜欢
    • 1970-01-01
    • 2020-05-28
    • 2021-11-06
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 2014-11-05
    相关资源
    最近更新 更多