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

如何在HTML字符串的多个<li>元素间保留<mark>标签?

如何在HTML字符串的多个
  • 元素间保留标签?
  • 哈哈,我太懂这种糟心的情况了!想给跨多个列表项的文本加高亮,结果<mark>标签要么被解析器悄咪咪改了结构,要么直接失效,是不是超头疼?

    其实核心问题出在HTML的嵌套规则上:<mark>是行内元素,而<li>是块级元素,行内元素直接包裹或者跨块级元素的写法本身就不符合规范,大部分解析工具(包括你用到的HTML解析库)都会自动“修正”这种不合法的嵌套,导致你的高亮效果跑偏。

    给你两个实用的解决思路:

    • 优先选:修正HTML结构,合法嵌套
      别再用<mark>直接跨<li>了,改成在每个<li>内部的对应文本片段单独加<mark>。举个例子:
      原来踩坑的写法(会被解析器修正):

      <mark>
        <li>列表项1的后半段高亮内容</li>
        <li>列表项2的前半段高亮内容</li>
      </mark>
      

      改成符合规范的写法:

      <li>列表项1的普通内容<mark>列表项1的后半段高亮内容</mark></li>
      <li><mark>列表项2的前半段高亮内容</mark>列表项2的普通内容</li>
      

      这种写法完全符合HTML规则,不管啥解析器都不会乱改,高亮效果稳稳的。

    • 特殊场景可选:自定义解析库的规则
      如果你的需求是动态生成跨<li>的高亮(比如根据搜索关键词自动匹配高亮),没法手动拆分<mark>,那可以给你用的HTML解析库加自定义处理逻辑,让它别乱改你的<mark>标签。拿常用的解析库举个代码例子:

      import parse from 'html-react-parser';
      
      // 你的原始HTML字符串
      const targetHtml = `包含跨<li>的<mark>标签的HTML内容`;
      
      // 自定义解析选项,保留mark标签的结构
      const parseOptions = {
        replace: domNode => {
          if (domNode.name === 'mark') {
            // 递归解析mark的子节点,强制保留mark标签
            return <mark>{domNode.children.map(child => parse(child.toString(), parseOptions))}</mark>;
          }
        }
      };
      
      // 解析后的内容可以直接在UI里用
      const renderedHtml = parse(targetHtml, parseOptions);
      

      不过要提醒你,这种写法还是不符合HTML规范,不同浏览器可能有渲染差异,所以能不用就尽量不用,优先选第一个方案。

    备注:内容来源于stack exchange,提问作者Aditya Prakash

    相关产品推荐
    方舟 Agent Plan

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

    最近更新时间:2026.04.13 17:09:38