0

0

如何在 React 中安全地格式化含换行与关键词高亮的代码字符串

碧海醫心

碧海醫心

发布时间:2026-03-13 11:10:11

|

177人浏览过

|

来源于php中文网

原创

如何在 React 中安全地格式化含换行与关键词高亮的代码字符串

本文介绍在 React 中将含 的长代码字符串渲染为带换行和语法高亮的 HTML 内容,重点解决动态插入 <br/> 与按词性(如 export、const、变量名等)添加 <span> 样式标签的协同实现方案。

本文介绍在 react 中将含 ` ` 的长代码字符串渲染为带换行和语法高亮的 html 内容,重点解决动态插入 `
` 与按词性(如 `export`、`const`、变量名等)添加 `` 样式标签的协同实现方案。

在 React 中直接使用 dangerouslySetInnerHTML 渲染带 HTML 标签的字符串虽快,但存在 XSS 风险且无法享受 JSX 类型检查与样式作用域优势。更健壮的做法是:将原始字符串结构化解析 → 按行拆分 → 每行内再按关键词正则匹配 → 分段包裹 <span> 并保留 <br/> 语义。以下为推荐的生产级实现方案:

✅ 推荐方案:逐行解析 + 行内关键词高亮

// 定义关键词匹配规则(支持类 CSS 选择器语义)
const TOKEN_RULES = [
  { pattern: /(export|import|default)/g, className: 'token-keyword' },
  { pattern: /(const|let|var|function|return)/g, className: 'token-declaration' },
  { pattern: /([a-zA-Z_$][w$]*)s*:/g, className: 'token-property' }, // 键名(如 "initial:")
  { pattern: /(fadeAnimation|initial|animate|exit)/g, className: 'token-identifier' },
  { pattern: /{[^}]*}/g, className: 'token-object' }, // 简单对象字面量高亮(可扩展)
];

// 主格式化函数:支持换行 + 关键词高亮 + 缩进
const formatCodeString = (text: string): React.ReactNode[] => {
  return text.split('
').map((line, index) => {
    // 第一行无缩进,其余行缩进 20px(对应原逻辑)
    const style = index === 0 
      ? { color: '#a69a9a' } 
      : { marginLeft: '20px', color: '#a69a9a' };

    // 对每行内容进行关键词替换:用 <span> 包裹匹配项,其余为纯文本
    let processedLine: React.ReactNode[] = [];
    let lastIndex = 0;

    TOKEN_RULES.forEach(({ pattern, className }) => {
      let match;
      // 注意:需全局重置 lastIndex,避免多规则交叉干扰(此处简化为顺序处理,实际建议合并正则)
      const tempLine = line.slice(lastIndex);
      while ((match = pattern.exec(tempLine)) !== null) {
        const start = match.index;
        const end = start + match[0].length;

        // 添加前置普通文本
        if (start > 0 && lastIndex + start > lastIndex) {
          processedLine.push(line.slice(lastIndex, lastIndex + start));
        }
        // 添加高亮 span
        processedLine.push(
          <span key={`${index}-${className}-${processedLine.length}`} className={className}>
            {match[0]}
          </span>
        );
        lastIndex = lastIndex + end;
      }
    });

    // 添加行尾剩余文本
    if (lastIndex < line.length) {
      processedLine.push(line.slice(lastIndex));
    }

    return (
      <div key={index} style={style}>
        {processedLine}
        <br />
      </div>
    );
  });
};

// 在组件中使用
function CodePreview() {
  const codeString = `export const fadeAnimation = {\n  initial: {opacity: 0, transition: { duration: 0.3, delay: 0.5 }, },\n  animate: { opacity: 1, transition: { duration: 0.3, delay: 0.3 }, },\n  exit: {opacity: 0, transition: { duration: 0.3, delay: 0 },}\n}`;

  return <div className="code-block">{formatCodeString(codeString)}</div>;
}

⚠️ 注意事项与最佳实践

  • 安全性优先:全程未使用 dangerouslySetInnerHTML,所有文本均作为 React 子节点渲染,天然防御 XSS。
  • 性能考量:对短代码块(<100 行)性能无压力;若需处理超长代码,建议配合 useMemo 缓存结果或使用 Web Worker 解析。
  • 样式隔离:推荐通过 CSS Modules 或 className 配合 CSS-in-JS 实现主题化,例如:
    .token-keyword { color: #007acc; font-weight: bold; }
    .token-identifier { color: #22863a; }
    .token-object { background: #f6f8fa; padding: 0 2px; border-radius: 3px; }
  • 扩展性设计:TOKEN_RULES 易于增删规则,可对接 Prism.js 词法定义或自定义 Babel 插件生成 token 配置。
  • 换行兼容性: 已被显式 .split(' ') 处理,确保跨平台(Windows/Linux/macOS)一致;若原始字符串含 ,建议先统一替换为 。

✅ 总结

与其手动拼接 JSX 数组或硬编码标记,不如构建一个可复用的 formatCodeString 工具函数——它将「换行布局」与「语法高亮」解耦,既保持 React 的声明式特性,又具备良好的可维护性与安全性。对于复杂代码展示场景(如文档站点、IDE 风格预览),还可进一步集成 react-syntax-highlighter 等成熟库,但本方案提供了轻量、可控、零依赖的落地路径。

歌者PPT
歌者PPT

歌者PPT,AI 写 PPT 永久免费

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6630

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

843

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

1092

2023.12.21

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

2198

2024.03.01

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

562

2023.09.20

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

760

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1567

2023.10.24

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号