You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用JavaScript正则替换指定内容并排除<ul>/<li>内的内容?

问题解决方法

现有转义后的HTML字符串:text&lt;br&gt;text&lt;br&gt;&lt;ul&gt;&lt;li&gt;text&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;,需要将所有text&lt;br&gt;替换为&lt;div&gt;text&lt;/div&gt;,但要排除<ul>/<li>标签内的内容,同时不能把<ul>...</ul>后面的<br>错误替换。当前用.replace(/(.*?)&lt;br&gt;/g, '&lt;div&gt;$1&lt;/div&gt;')会误处理ul结尾后的br,下面是两种解决办法:

方法1:优化正则表达式

用正则的断言规则限定替换范围,只处理不在ul标签里、且前面不是</ul>的&lt;br&gt;:

const str = 'text&lt;br&gt;text&lt;br&gt;&lt;ul&gt;&lt;li&gt;text&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;';
const result = str.replace(/((?!&lt;\/?ul&gt;).)*?(?<!&lt;\/ul&gt;)&lt;br&gt;/g, '&lt;div&gt;$1&lt;/div&gt;');
console.log(result);

规则说明:

  • (?!&lt;\/?ul&gt;).:确保匹配的内容不会碰到<ul>或</ul>标签,避开ul内部的内容
  • (?<!&lt;\/ul&gt;):检查&lt;br&gt;前面不是</ul>,防止把ul后面的br也套进div里

方法2:用DOM解析(更稳妥)

正则处理HTML容易踩坑(比如嵌套ul、标签带特殊属性),用DOM API解析后操作更靠谱:

const str = 'text&lt;br&gt;text&lt;br&gt;&lt;ul&gt;&lt;li&gt;text&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;';
// 先把转义字符还原成正常HTML
const html = str.replace(/&lt;/g, '<').replace(/&gt;/g, '>');

const tempDiv = document.createElement('div');
tempDiv.innerHTML = html;

// 遍历节点处理
const nodes = tempDiv.childNodes;
for (let i = 0; i < nodes.length; ) {
  const node = nodes[i];
  if (node.nodeType === Node.ELEMENT_NODE && node.tagName === 'BR') {
    const prevNode = node.previousSibling;
    if (prevNode && prevNode.nodeType === Node.TEXT_NODE) {
      // 给前面的文本套div,替换掉文本和br
      const div = document.createElement('div');
      div.textContent = prevNode.textContent;
      tempDiv.replaceChild(div, prevNode);
      tempDiv.removeChild(node);
    } else if (prevNode && prevNode.tagName === 'UL') {
      // 前面是ul的话直接跳过这个br
      i++;
    }
  } else {
    i++;
  }
}

// 再把HTML转义回原格式
const result = tempDiv.innerHTML.replace(/</g, '&lt;').replace(/>/g, '&gt;');
console.log(result);

内容的提问来源于stack exchange,提问作者user20479148

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 07:52:41