Convierte una cadena que contiene HTML en oraciones y también mantienes el separador usando Javascript

Esta es mi cadena. Contiene algo de HTML:

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://img.javascriptes.com/javascript/hello.png" /> and ends with !? The last sentence looks like <b>this</b>??

Quiero dividir la cadena en oraciones (matriz), mantener el HTML y el separador. Me gusta esto:

 [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://img.javascriptes.com/javascript/hello.png" /> and ends with !? [3] = The last sentence looks like <b>this</b>?? 

¿Alguien puede sugerirme una forma de hacer esto, por favor? ¿Puede estar usando Regex y Match?

Esto es muy parecido a lo que busco, pero no realmente con los bits HTML: JavaScript Split Regular Expression keep the delimiter

La parte fácil es el análisis sintáctico; puedes hacer esto fácilmente envolviendo un elemento alnetworkingedor de la string. Dividir las oraciones es algo más complejo; esta es mi primera puñalada:

 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://img.javascriptes.com/javascript/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); 

Manifestación

Cada nodo que es un elemento o una frase inacabada se agrega a un búfer hasta que se encuentra una oración completa; luego se antepone a la matriz de resultados.