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

如何编写通用函数实现自定义标签的自动替换?

自定义标签替换需求与解决方案

需求概述

需要实现三类自定义标签的自动替换:

  • <day> 替换为当前日期的日份(示例:14)
  • <red>...</red> 替换为 <span style="color: red">...</span>
  • <a ###链接>文本</> 替换为 <a href="链接">文本</a>

现有一个仅处理<red>标签的JavaScript函数,需改造为能处理所有三类标签的通用函数,同时结合Vue模板渲染内容。

现有代码

JavaScript处理函数

export const formatTags = (content) => {
  const firstTag = "<red>";
  const secondTag = "</red>";

  const tagsIndex = [...content.matchAll(new RegExp(firstTag, "gi"))].map(
    (a) => a.index
  );

  const initialContent = content;

  tagsIndex.forEach((index) => {
    const tagContent = initialContent.substring(
      index + firstTag.length,
      initialContent.indexOf(secondTag, index)
    );

    if (firstTag === "<red>") {
      content = content.replaceAll(
        `${firstTag}${tagContent}${secondTag}`,
        `<span style="color: red">${tagContent || "わからない"}</span>`
      );
    }
  });

  return content;
};

Vue模板

<span
   :class="(msg.image || msg.file) && msg.text ? 'mt-2' : ''"
   v-html="msg.text"
   v-linkified:options="{
    className: currentUserId === msg.senderId
     ? 'message-external-link'
     : '',
   }"
/>

改进后的通用替换函数

通过正则表达式批量替换可以实现更简洁高效的通用处理,避免手动遍历索引的复杂逻辑:

export const formatTags = (content) => {
  if (!content) return content;

  // 1. 替换<day>为当前日期的日份(补0处理,确保两位数格式,如5号显示为05)
  const currentDay = new Date().getDate().toString().padStart(2, '0');
  content = content.replace(/<day>/g, currentDay);

  // 2. 替换<red>...</red>为红色span,支持大小写不敏感的标签(如<RED>)
  content = content.replace(/<red>([\s\S]*?)<\/red>/gi, (match, text) => {
    return `<span style="color: red">${text || "わからない"}</span>`;
  });

  // 3. 替换<a ###链接>文本</>为标准a标签
  content = content.replace(/<a ###([^>]+)>([\s\S]*?)<\/>/g, (match, href, text) => {
    return `<a href="${href.trim()}">${text || ''}</a>`;
  });

  return content;
};

Vue模板使用调整

在Vue模板中,需要将msg.text通过formatTags处理后再传入v-html:

<span
   :class="(msg.image || msg.file) && msg.text ? 'mt-2' : ''"
   v-html="formatTags(msg.text)"
   v-linkified:options="{
    className: currentUserId === msg.senderId
     ? 'message-external-link'
     : '',
   }"
/>

代码说明

  • 使用[\s\S]*?匹配标签内任意内容(包括换行),非贪婪模式避免匹配跨标签的内容
  • <day>的补0处理为可选逻辑,若不需要两位数格式可移除padStart(2, '0')
  • 每个替换逻辑独立,后续新增标签只需添加对应正则替换规则即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 00:35:20