我正在尝试解析包含多个项目符号的文本文档。
我想解析一个包含单个换行符的项目符号,但是当找到2个或更多换行符时想要中断。
for example :
-----------------------------------
* bullet
text on new line
more text
this should be a separate block
-----------------------------------
when passed through the function, this should capture :
-----------------------------------
-> start
bullet
text on new line
more text
<- end capture
this should be a seperate block
-----------------------------------
这就是我到目前为止,我已经编写了一个javascript函数,可以递归地将有序/无序的mediawiki&sh!列表解析为html。唯一不同的是,块在2个换行符上插入,而对于1个换行符的mediawiki方式。
function parseLists(str)
{
//How can I capture bulleted lines with less than or equal to "1" newline character?
return str.replace(/(?:(?:(?:^|\n)[\*#].*)+)/g, function (match) {
var listType = match.match(/(^|\n)#/) ? 'ol' : 'ul';
match = match.replace(/(^|\n)[\*#][ ]{0,1}/g, "$1");
match = parseLists(match);
return '<'
+ listType + '><li>'
+ match.replace(/^\n/, '').split(/\n/).join('</li><li>')
+ '</li></' + listType
+ '>';
});
}
http://jsfiddle.net/epinapala/L18y7zyx/7/
我认为问题在于第一个正则表达式 - /(?:(?:(?:^||)[*#]。*)+)/ g来匹配bullts,这个正则表达式实际上在换行时会中断找到字符,如何捕获小于或等于&#34; 1&#34;换行符?
我想用子线中的换行符解析子弹,并且只有在有2个或更多新换行符时才想打破子弹。其次是子弹内容。
[编辑] - 我能够进行一些更改,我的功能的当前版本如下所示
function parseLists2(str)
{
return str.replace(/(?:(?:(?:^|\n)[\*#](?:.+\n)+.*))/g, function(match){
match = match.replace(/\n(?![#\*])/g," ");
//alert(match);
var listType = match.match(/(^|\s)#/) ? 'ol' : 'ul';
match = match.replace(/(^|\s)[\*#][ ]{0,1}/g, "$1");
match = parseLists2(match);
return '<'
+ listType + '><li>'
+ match.replace(/^\s/, '')
.split(/\n/).join('</li><li>')
+ '</li></' + listType
+ '>';
});
}
我面临的唯一问题是如果我有如下模式:
* some ul item
* some ul item
# some ol item
ul项目不会被分隔为块,除非它被双线断开分开。
谢谢!
答案 0 :(得分:1)
您可以使用这两个(1,2)正则表达式为您的项目符号创建列表和<li>
:
/\*\s*(([^\n]*(\n|$))*?)(?=\n|#|\*|<[uo]l>|$)/g;
/#\s*(([^\n]*(\n|$))*?)(?=\n|#|\*|<[uo]l>|$)/g;
然后,您可以使用another regex加入相邻的<ul>
和<ol>
:
/(<\/ul>\n?<ul>|<\/ol>\n?<ol>)/g;
以下代码段演示了这一点:
txt1.onkeyup = txt1.onkeydown = txt1.onchange = replace;
replace();
function replace() {
txt2.innerHTML = txt1.value.
replace (/\*\s*(([^\n]*(\n|$))*?)(?=\n|#|\*|<[uo]l>|$)/g, "<ul><li>\n$1</li></ul>").
replace ( /#\s*(([^\n]*(\n|$))*?)(?=\n|#|\*|<[uo]l>|$)/g, "<ol><li>\n$1</li></ol>").
replace (/(<\/ul>\n?<ul>|<\/ol>\n?<ol>)/g, "");
}
#txt1, #txt2 {
width: 40%;
height: 150px;
display: inline-block;
overflow-y: scroll;
}
<textarea id="txt1">
* aaaa
* bbbb
# cccc
# dddd
This text is separate.
</textarea><div id="txt2"></div>