markdown解析问题

最近在用js解析markdown
headline的正则如何写?

多个#,最后一个要作为标题,比如##,那么第一个#作为<h1>来解释,第二个#作为标题来解释,最后解析得到:<h1>#</h1>

一般情况是## title,井号和标题之间会有若干个空格。但标题自身里面的空格则要显示出来。

var headline = /^(\#{1,6})([^\#\n]+)$/m
var str = "## a##"
while ((stra = headline.exec(str)) !== null) {
  count = stra[1].length;
  str = str.replace(stra[0], '<h' + count + '>' + stra[2].trim() + '</h' + count + '>').trim();
}

比如:

var headline = /^(\#{1,6})(.*?)$/g
var str = "##a##"
while ((stra = headline.exec(str)) !== null) {
  console.log(stra)
  count = stra[1].length;
  str = str.replace(stra[0], '<h' + count + '>' + stra[2].trim() + '</h' + count + '>').trim();
}

能解决以#结尾的问题,但不能解决全是#的情况

使用typora的时候我发现,typora并不能解析以#结尾的标题,但可以解决全是#的情况,最后一个#号会当做标题。

其实最好的写法应该是多个#号之后写个空格,然后写标题,而标题的内容应该可以是任意的(无论是否包含#号,或是以#号结尾),所以var headline = /^(\#{1,6})(.*?)$/g应该是理想的答案,可以处理## #的问题就行了。

阅读 2k
1 个回答
const str = '######### #Markdown#######'

const reg = /^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/

console.log(str.replace(reg,function(_, i, content){
  return `<h${i.length}>${content}</h${i.length}>`
}))

// ######### #Markdown####### -> <h6>### #Markdown#</h6>
// ##Markdown# -> <h2>Markdown</h2>
// ### ## #Markdown# # -> <h3> ## #Markdown# </h3>
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进