从字符串中找到 '*' 、 '**' 和 '`' 并替换为 <strong></strong> 和 <code></cod in javascript, Typescript

find '*' , '**' and '`' from string and replace with <strong></strong> and <code></cod in javascript, Typescript

我们需要处理一个 "string" 并用 <strong></strong> 包围 '*' 和 '**' 之间的所有文本,类似地用 <code> </code> 包围 backTic 之间的文本。现在我已经编写了逻辑,它也能正常工作,但我相信,一定有更好的方法,因为对于这个简单的字符串处理任务来说,代码太多了。以下是我的代码。感谢任何建议。

输入 = "*within single star* and **within double start** and this is `backtick string`"

输出 = "<strong>within single star</strong> and <strong>within double start</strong> and this is <code>backtick string</code>"

transform(data: any) {
        if (data) {
            const processDblStar = (input) => {
                const regExforDoubleStar = /(\*\*)+/gi;
                let i = 0;
                const result = input.replace(regExforDoubleStar, (match, matchedStr, offset) => {
                    i++;
                    return i % 2 === 0 ? '</strong>' : '<strong>';
                });
                return result;
            };

            const processSingleStar = (input) => {
                const regExforSingleStar = /(\*)+/gi;
                let i = 0;
                const result = input.replace(regExforSingleStar, (match, matchedStr, offset) => {
                    i++;
                    return i % 2 === 0 ? '</strong>' : '<strong>';
                });
                return result;
            };

            const processBackTick = (input) => {
                const regExforBackTick = /(\`)+/gi;
                let i = 0;
                const result = input.replace(regExforBackTick, (match, matchedStr, offset) => {
                    i++;
                    return i % 2 === 0 ? '</code>' : '<code>';
                });
                return result;
            };

            const processPipeline = (functions) => (inputStr) => functions.reduce((result, fn) => fn(result), inputStr);

            const funcArr: Function[] = [];
            if (data.indexOf('`') >= 0) {
                funcArr.push(processBackTick);
            }
            if (data.indexOf('*') >= 0) {
                funcArr.push(processSingleStar);
            }
            if (data.indexOf('**') >= 0) {
                funcArr.push(processDblStar);
            }

            processPipeline(funcArr)(data);
        }
    }

您可以使用正则表达式对 *** 之间的所有文本进行分组。使用这个组,您可以通过使用 </code> 引用它来在您的替换字符串中使用它。我们也可以用反引号做同样的事情,但是,相反,将匹配的组包围在 <code><code></code> 标签中。

const str = '*within single star* and **within double start** and this is `backtick string`';

const proccessPipeline = s =>
   s.replace(/\*{1,2}(.*?)\*{1,2}/g, '<strong></strong>')
    .replace(/`(.*?)`/g, '<code></code>');

const res = proccessPipeline(str);
console.log(res);
document.body.innerHTML = res;

这不是最好的方法。但代码短。

var converter = new showdown.Converter();
var input = "*within single star* and **within double start** and this is `backtick string`";
var output = converter.makeHtml(input);
output = "\"" + output + "\""
output = output.replace(/<p>/g, "")
output = output.replace(/<\/p>/g, "")
output = output.replace(/<em>/g, "<strong>")
output = output.replace(/<\/em>/g, "</strong>")
console.log(output)
<script src="https://cdnjs.cloudflare.com/ajax/libs/showdown/1.9.0/showdown.min.js"></script>