模板信息渲染和正则表达式的运用

业务

后台配置模板消息

  • 配置变量名及相关数据,用来进行查询
  • 配置模板信息,嵌入变量名

前台渲染

  • 通过接口获取模板信息
  • 将模板消息中的变量替换成对应的数据
模板信息: '今天到场一共${aaa}人,其中男${bbb}人,女${ccc}人'
相关信息:
{
    describe:'今天到场一共${aaa}人,其中男${bbb}人,女${ccc}人',
    items:[
        {
            variable:'aaa',
            value: 100
        },
        {
            variable:'bbb',
            value: 50
        },
        {
            variable:'ccc',
            value: 50
        }
    ]
}

其中,模板会存在各种格式

模板信息: '今天到场一共${aaa}人,其中男${bbb}人,女${ccc}人 /n  test${aaa} /n ${aaa}${bbb} /n ${aaa}123${bbb}'

 

实现

利用正则表达式处理变量替换

  • ^([\s\S]*?)\$\{(\w+)\}匹配任意字符串开头接上${任意字符串}
     
  • ^\$\{(\w+)\}匹配${任意字符串}

利用css样式处理换行

  • style={{
        wordBreak: 'break-all',
        whiteSpace: 'pre-wrap',
    }}
//templateData为接口数据
const handleTemplateData = useMemo<ReactNode[]>(() => {
    if (!templateData || !templateData.describe) return [];
    const result: ReactNode[] = [];
    let _describe: string = templateData.describe;
    const regexp: RegExp = /^([\s\S]*?)\$\{(\w+)\}|^\$\{(\w+)\}/;
    let match: RegExpMatchArray | null = regexp.exec(_describe); //匹配***${***}字符串
    while (match) {
      const str = match[0]; //获取匹配到的***${***}字符串
      const string = match[1]; //获取非${****}字符串
      const value = match[2]; //获取匹配${****}中的变量名
      const getDateFromApiData = (***) => {****}
      result.push(
        <Fragment>
          {string}{getDateFromApiData(***)}
        </Fragment>
      );
      _describe = _describe.replace(str, ''); //替换已经匹配的字符串
      match = regexp.exec(_describe); //重新匹配查询
    }
    if (_describe.length > 0) result.push(<Fragment>{_describe}</Fragment>); //arr放入剩余字符串
    return result;
  }, [templateData]);

 

posted @ 2024-10-18 17:21  Karle  阅读(7)  评论(0编辑  收藏  举报