JavaScript实现文字转表情包RegExp正则matchAllcreateDocumentFragmentappendcreateElementappendremoveslic

Posted web半晨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript实现文字转表情包RegExp正则matchAllcreateDocumentFragmentappendcreateElementappendremoveslic相关的知识,希望对你有一定的参考价值。

let str = '[左哼哼]你好[微笑]世界[哈哈]',
    str2 = '你好<div></div>世界';

function scrmTextEmojiRenderFn(value) 
    const reg = /\\[+[^\\[\\]]+\\]/g;
    if (value === null || value === undefined || value === '') value = '';

    const fragment = document.createDocumentFragment();
    let renderRes = value,
        renderArr = [...value.matchAll(reg)];

    if (renderArr.length > 0)  // 匹配[]为主的表情
        // 用reg.test(value)做判断,renderArr的少了第一项,不明原因
        let renderResArr = [];
        // 专门处理表情所处的位置,表情的长度
        renderArr.forEach(item => 
            let renderItemTemplate = 
                name: '',
                index: '',
                length: '',
            ;
            renderItemTemplate.name = item[0];
            renderItemTemplate.index = item['index'];
            renderItemTemplate.length = renderItemTemplate.name.length;
            renderResArr.push(renderItemTemplate);
        )
        const renderEmojiFn = (name, spanDom, renderRes) =>  // 专门处理表情的渲染
            // if (emojisAmap[name]) // 字符串携带有[]
            //     spanDom.classList.add('emoji_a');
            //     spanDom.classList.add(emojisAmap[name]);
            //  else 
            spanDom.classList.remove('chat-emoji');
            spanDom.innerText = "[" + name + "]";
            // 
            renderRes.append(spanDom);
        ;
        renderRes = document.createDocumentFragment();
        renderResArr.forEach((item, i) => 
            // 遍历筛选出来的标签,去源数据里面组装数据。
            // 根据源数据中的表情出现的位置顺序,
            // 去进行组装文字+标签+文字的数据
            // 根据每个出现的表情的前面是否有文字,
            // 标签的后面是否有文字进行拼装数据
            let  name, index, length  = item;
            name = name.split("[")[1].split("]")[0];
            let spanDom = document.createElement('span');
            spanDom.classList.add('chat-emoji');
            let renderText = '',
                rendertextSpan = document.createElement('span');

            if (i === 0)  // 第一项===>标签的[出现在第一项
                renderText = value.slice(0, index);
                rendertextSpan.innerText = rendertextSpan;
                renderRes.append(rendertextSpan); // 文字
                renderEmojiFn(name, spanDom, renderRes); // 表情
                if (renderResArr.length === 1)  // 当前筛选出来的表情只有一个数量的时候
                    let nextRendertext = value.slice(index + length),
                        nextRendertextSpan = document.createElement('span');
                    nextRendertextSpan.innerText = nextRendertext;
                    renderRes.append(nextRendertextSpan); // 文字
                
             else if (i === renderResArr.length - 1)  // 最后一项
                renderText = value.slice(length + index); // 在表情的后面文字
                let preItem = renderResArr[i - 1],
                    preIndex = preItem.index + preItem.length,
                    renderPreText = value.slice(preIndex, index), // 在表情的前面的文字
                    renderPreTextSpan = document.createElement('span');

                renderPreTextSpan.innerText = renderPreText;
                renderRes.append(renderPreTextSpan);
                renderEmojiFn(name, spanDom, renderRes);
                rendertextSpan.innerText = renderText;
                renderRes.append(rendertextSpan);
             else 
                let preItem = renderResArr[i - 1],
                    preIndex = preItem.index + preItem.length;
                renderText = value.slice(preIndex, index);
                rendertextSpan.innerText = renderText;
                renderRes.append(rendertextSpan);
                renderEmojiFn(name, spanDom, renderRes);
            
        )
     else 
        const renderResSpan = document.createElement('span');
        renderResSpan.innerText = renderRes;
        renderRes = renderResSpan;
    
    fragment.append(renderRes);
    return fragment;


console.log(scrmTextEmojiRenderFn(str));
console.log(scrmTextEmojiRenderFn(str2));

以上是关于JavaScript实现文字转表情包RegExp正则matchAllcreateDocumentFragmentappendcreateElementappendremoveslic的主要内容,如果未能解决你的问题,请参考以下文章

视频转GIF小工具,原生javascript + gif.js + canvas,自定义制作表情包

小米3更新系统后搜狗输入法表情只变成了一个点,如何复原

IM项目中的自定义小表情实现

Python每日一练(23)-基于百度 AI 识别抓取的表情包

微信打字出表情包怎么设置 微信打字出表情包如何设置

教你用Python制作表情包,实现换脸技术!