2014-12-15 26 views
6

Birden çok madde işareti içeren bir metin belgesini ayrıştırmaya çalışıyorum.Düz metinden yeni satırları içeren mermi ayırma

Bekarım satır karakterlerini sahip bir mermi noktasını ayrıştırmak istiyorum ama 2 veya daha fazla satır karakterlerinin bulunduğunda kırmak istiyoruz

.

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 
----------------------------------- 

Ben de bugüne kadar, ben yinelemeli html/sırasız mediawiki'sh listeleri sipariş ayrıştırmak bir javascript fonksiyonu yazdım da budur. Tek fark, blokların, 2 satırlık molalar ve 1 seri molaların mediawiki yolu ile ortaya çıkmasıdır. /(?:(?:(?:^|\n)[*#].*)+)/g maç için -

http://jsfiddle.net/epinapala/L18y7zyx/7/

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 
       + '>'; 
    }); 
} 
Sorun ilk regex ile olduğunu düşünüyorum bullts, bu regex, bir satırsonu karakteri bulunduğunda kesilir, "1" satır karakterine eşit veya daha az ile satırları nasıl yakalayabilirim?

İçlerinde satırsonu ile mermi ayrıştırmak istiyorum ve 2 veya daha fazla yeni satır karakterleri olmaması durumunda bir mermi kırmak istiyoruz. Mermi içeriği izledi.

[Düzenle] - Bir desen gibi aşağıda varsa

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 
       + '>'; 
    }); 
} 

altına Karşılıklı tek sorun gibi bazı değişiklikler ve benim fonksiyonun güncel sürümünü yapabildi görünür:

bir çift çizgi arası ile ayrılmış sürece

ul madde

* some ul item 
* some ul item 
# some ol item 
bir blok olarak ayrılmış varlık değildir.

Teşekkürler!

+0

herhangi büyük test durumları var mı? –

+0

Test metnini büyütmek için tekrarlanan aynı işaretleme. Ayıklamaya çalıştığım her şey, iki veya daha fazla yeni satır karakteriyle ayrılmadıkça, her bir madde işareti noktasıdır. Sorun şu ki, bir satırsonu karakteri bile tamamen yeni bir metin bloğu olarak ayrıştırılıyor. –

+0

bir şey özyinelemeli regex ile yanlış şüpheli, bu yüzden bu örnekle geldi: http://pastebin.com/RkGj3h4v –

cevap

1

Önce listeleri oluşturabilir ve bu iki (1, 2) regexs kullanarak mermi <li> s:

/\*\s*(([^\n]*(\n|$))*?)(?=\n|#|\*|<[uo]l>|$)/g; 
/#\s*(([^\n]*(\n|$))*?)(?=\n|#|\*|<[uo]l>|$)/g; 

Daha sonra another regex kullanarak <ul> ler ve <ol> ler bitişik katılabilirsiniz:

/(<\/ul>\n?<ul>|<\/ol>\n?<ol>)/g; 

Örnek

Aşağıdaki parça et bu gösterir:

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>

İlgili konular