2013-05-04 12 views
5

Dies ist meine Zeichenfolge. Es enthält einige HTML:Konvertieren Sie Zeichenfolge, die HTML enthält, zu Sätzen und Trennzeichen mit Hilfe von Javascript

First sentence. Here is a <a href="http://google.com">Google</a> link in the second sentence! The third sentence might contain an image like this <img src="http://link.to.image.com/hello.png" /> and ends with !? The last sentence looks like <b>this</b>??

Ich möchte die Zeichenfolge Sätze (Array) teilen, halten Sie die HTML sowie den Separator. Gefällt mir:

[0] = First sentence. 
[1] = Here is a <a href="http://google.com">Google</a> link in the second sentence! 
[2] = The third sentence might contain an image like this <img src="http://link.to.image.com/hello.png" /> and ends with !? 
[3] = The last sentence looks like <b>this</b>?? 

Kann mir jemand bitte einen Vorschlag machen? Kann Regex verwenden und übereinstimmen?

Das ist ganz in der Nähe zu dem, was nach dem ich bin, aber mit den HTML-Bits nicht wirklich: JavaScript Split Regular Expression keep the delimiter

+1

Ich nehme an, dass Ihr HTML verschachtelt sein kann, das ein p enthält, das eine Spanne enthält. Dann haben Sie keine andere Lösung, als es zu parsen. –

+1

Was passiert, wenn sich in den Tag-Inhalten "Satztrennzeichen" befinden? –

+0

Und was ist Ihr Separator? ". ' oder '? ' oder '! ' oder '??' oder alle oben ... – CoR

Antwort

1

Der einfache Teil ist die Analyse; Sie können dies leicht tun, indem Sie ein Element um die Zeichenfolge wickeln. Die Sätze zu splitten ist etwas komplizierter; dies ist mein erster Stich an es:

var s = 'First sentence. Here is a <a href="http://google.com">Google.</a> link in the second sentence! The third sentence might contain an image like this <img src="http://link.to.image.com/hello.png" /> and ends with !? The last sentence looks like <b>this</b>??'; 

var wrapper = document.createElement('div'); 
wrapper.innerHTML = s; 

var sentences = [], 
buffer = [], 
re = /[^.!?]+[.!?]+/g; 

[].forEach.call(wrapper.childNodes, function(node) { 
    if (node.nodeType == 1) { 
    buffer.push(node.outerHTML); // save html 
    } else if (node.nodeType == 3) { 
    var str = node.textContent; // shift sentences 
    while ((match = re.exec(str)) !== null) { 
     sentences.push(buffer.join('') + match); 
     buffer = []; 
     str = str.substr(re.lastIndex + 1); 
     re.lastIndex = 0; // reset regexp 
    } 
    buffer.push(str); 
    } 
}); 

if (buffer.length) { 
    sentences.push(buffer.join('')); 
} 

console.log(sentences); 

Demo

Jeden Knoten, der entweder ein Element oder ein unvollendeter Satz ist wird in einen Puffer gegeben, bis ein vollständiger Satz gefunden wird; Es wird dann dem Ergebnis-Array vorangestellt.

+0

Vielen Dank dafür. Leider scheitert es manchmal. Bitte werfen Sie einen Blick auf dieses Beispiel: http://jsbin.com/acoyiv/2 – suprb

+0

@suprb Ich habe vergessen, das RegExp-Objekt jedes Mal zurückgesetzt, wenn ein Satz gefunden wird; sollte jetzt behoben werden :) –

+0

Vielen Dank Jack. Funktioniert super. ;) – suprb

Verwandte Themen