La forma en que lo hago es prácticamente de una sola línea.
La función crea un objeto Range y luego crea un DocumentFragment en el Range con la cadena como contenido secundario.
Luego toma el texto del fragmento, elimina cualquier carácter "invisible" / de ancho cero y lo recorta de cualquier espacio en blanco inicial / final.
Me doy cuenta de que esta pregunta es antigua, solo pensé que mi solución era única y quería compartirla. :)
function getTextFromString(htmlString) {
return document
.createRange()
// Creates a fragment and turns the supplied string into HTML nodes
.createContextualFragment(htmlString)
// Gets the text from the fragment
.textContent
// Removes the Zero-Width Space, Zero-Width Joiner, Zero-Width No-Break Space, Left-To-Right Mark, and Right-To-Left Mark characters
.replace(/[\u200B-\u200D\uFEFF\u200E\u200F]/g, '')
// Trims off any extra space on either end of the string
.trim();
}
var cleanString = getTextFromString('<p>Hello world! I <em>love</em> <strong>JavaScript</strong>!!!</p>');
alert(cleanString);