【发布时间】:2021-09-01 14:56:36
【问题描述】:
我正在尝试使用 Javascript 构建自定义标记语言解析器。
例如:-
-
**bold**==> 粗体 -
__italics__==> 斜体
为了显示解析后的文本,我尝试将特殊字符替换为
html标签,并将它们传递给label的innerHTML。
-
**bold**==><b>bold</b>
我的第一种方法是只使用replace 函数,但这并不理想,因为它只能替换开始标记,而不是结束标记。
然后我找到了一个用 JS 正则表达式的临时解决方案,
const bold = /\*\*([A-z0-9]+)\*\*/gi
const italics = /\_\_([A-z0-9]+)\_\_/gi
const updateTextMessage = () => {
let text = $('#textParser').val()
text = text.replace(bold, '<b>$1</b>')
text = text.replace(italics, '<i>$1</i>')
$('#parsedText').html(text)
}
body{
display: flex;
flex-direction: column;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<span id="parsedText">Parsed text will appear here</span>
<textarea id="textParser" oninput="updateTextMessage()" type="text" placeholder="Type Here"></textarea>
但是这段代码的问题是当我在中间给出一个句子时,它不起作用;
**This sentence should be bold** ==> 这句话要加粗
这不起作用。
我知道这是不允许这种情况发生的正则表达式,我也知道正则表达式的工作,即/\*\*(.*)\*\*/gim
但这也会转换不需要的情况。
例如,我不希望这些是有效的语法。
** hello**
** hello, this a sentence**
(区别在于特殊字符和文本之间的分隔。这有点类似于 WhatsApp 标记文本的工作方式。)
如何使用正则表达式解决这个问题?我也对其他方法感兴趣。
【问题讨论】:
-
有很多 npm 包可以解决这个问题。有什么理由建立自己的?不要重新发明轮子!
-
您必须弄清楚特定领域标记语言语法的所有细微差别。例如,您是否要允许使用反斜杠转义字符?嵌套
__**x**__怎么样?你想如何解决**__**__?两个粗体星号的降价是多少?诸如此类的事情都需要解决。一旦你有了一个语法,你就可以解析它并转换它——或者决定语法是否足够简单,可以让正则表达式处理。 find a markdown module也不是没有道理。
标签: javascript regex text-parsing