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

React.js中如何实现字符串指定部分内容的加粗渲染

实现方案

核心思路

我们需要对原HTML字符串的标签做精准替换,核心逻辑如下:

  • 先通过DOM解析器把字符串转为可操作的DOM结构,避免正则替换容易出现的嵌套标签误匹配问题
  • 倒序遍历所有<em>标签(优先处理内层嵌套节点),仅替换**直接子节点为纯文本、且文本内容为class或physics**的<em>标签为<strong>标签
  • 把处理后的DOM结构转回HTML字符串,在React中渲染即可

完整代码实现

import React from 'react';

function EmToStrongRenderer() {
  const originStr = 'Hello I am <em>developer</em> this is a <em>class</em> of <em><em>physics</em></em>';

  const processHtml = (str) => {
    // 解析HTML字符串为DOM对象
    const parser = new DOMParser();
    const htmlDoc = parser.parseFromString(str, 'text/html');
    // 拿到所有em节点
    const emList = htmlDoc.querySelectorAll('em');

    // 倒序遍历,优先处理内层嵌套的em节点
    for (let i = emList.length - 1; i >= 0; i--) {
      const currentEm = emList[i];
      const text = currentEm.textContent.trim();
      // 仅替换直接子节点为纯文本、且内容符合要求的em节点
      const isPureTextEm = currentEm.childNodes.length === 1 
        && currentEm.childNodes[0].nodeType === Node.TEXT_NODE;

      if (isPureTextEm && (text === 'class' || text === 'physics')) {
        const strongNode = htmlDoc.createElement('strong');
        strongNode.textContent = text;
        currentEm.parentNode.replaceChild(strongNode, currentEm);
      }
    }

    return htmlDoc.body.innerHTML;
  };

  const processedHtml = processHtml(originStr);

  // 若源字符串是可信任的,直接用dangerouslySetInnerHTML渲染即可
  return <div dangerouslySetInnerHTML={{ __html: processedHtml }} />;
}

export default EmToStrongRenderer;

补充说明

  • 如果源字符串来自用户输入等不可信任场景,建议先对字符串做XSS过滤,再进行上述处理,避免恶意代码注入
  • 不想使用dangerouslySetInnerHTML的话,可以额外写递归逻辑,把处理后的DOM节点逐一转为React.createElement生成的React元素,安全性更高

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 08:06:02