Sottostringa il testo con tag HTML in Javascript

Hai una soluzione al testo della sottostringa con tag HTML in Javascript?

Per esempio:

var str = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.' html_substr(str, 20) // return Lorem ipsum dolor si html_substr(str, 30) // return Lorem ipsum dolor sit amet, co 

Prendendo in considerazione che l’ analisi di html con regex è una ctriggers idea , ecco una soluzione che fa proprio questo 🙂

EDIT: Giusto per essere chiari: questa non è una soluzione valida, è stata pensata come un esercizio che ha fatto delle ipotesi molto blandi sulla stringa di input, e come tale dovrebbe essere presa con un pizzico di sale. Leggi il link qui sopra e scopri perché non è mai ansible analizzare l’html con espressioni regolari.

 function htmlSubstring(s, n) { var m, r = /< ([^>\s]*)[^>]*>/g, stack = [], lasti = 0, result = ''; //for each tag, while we don't have enough characters while ((m = r.exec(s)) && n) { //get the text substring between the last tag and this one var temp = s.substring(lasti, m.index).substr(0, n); //append to the result and count the number of characters added result += temp; n -= temp.length; lasti = r.lastIndex; if (n) { result += m[0]; if (m[1].indexOf('/') === 0) { //if this is a closing tag, than pop the stack (does not account for bad html) stack.pop(); } else if (m[1].lastIndexOf('/') !== m[1].length - 1) { //if this is not a self closing tag than push it in the stack stack.push(m[1]); } } } //add the remainder of the string, if needed (there are no more tags in here) result += s.substr(lasti, n); //fix the unclosed tags while (stack.length) { result += ''; } return result; } 

Esempio: http://jsfiddle.net/danmana/5mNNU/

Nota: la soluzione di patrick dw potrebbe essere più sicura per quanto riguarda l’html, ma non sono sicuro di come gestisca gli spazi bianchi.

Uso:

 var str = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'; var res1 = html_substr( str, 20 ); var res2 = html_substr( str, 30 ); alert( res1 ); // Lorem ipsum dolor si alert( res2 ); // Lorem ipsum dolor sit amet, co 

Esempio: http://jsfiddle.net/2ULbK/4/


Funzione:

 function html_substr( str, count ) { var div = document.createElement('div'); div.innerHTML = str; walk( div, track ); function track( el ) { if( count > 0 ) { var len = el.data.length; count -= len; if( count < = 0 ) { el.data = el.substringData( 0, el.data.length + count ); } } else { el.data = ''; } } function walk( el, fn ) { var node = el.firstChild; do { if( node.nodeType === 3 ) { fn(node); // Added this >>------------------------------------< < } else if( node.nodeType === 1 && node.childNodes && node.childNodes[0] ) { walk( node, fn ); } } while( node = node.nextSibling ); } return div.innerHTML; } 

è la soluzione per singoli tag

 function subStrWithoutBreakingTags(str, start, length) { var countTags = 0; var returnString = ""; var writeLetters = 0; while (!((writeLetters >= length) && (countTags == 0))) { var letter = str.charAt(start + writeLetters); if (letter == "< ") { countTags++; } if (letter == ">") { countTags--; } returnString += letter; writeLetters++; } return returnString; } 

Javascript ha un metodo sottostringa. Non fa differenza se la stringa contiene html.

vedere http://www.w3schools.com/jsref/jsref_substr.asp

Usa qualcosa di simile a = str.replace(/< [^>]*>?/gi, '').substr(0, 20);
Ho creato un esempio su: http://fiddle.jshell.net/xpW9j/1/