HTML-Zeichen aus XML korrekt darstellen

harrry

Erfahrenes Mitglied
Lieber Datic,

es ist mir voll peinlich, weil ich doch versprochen habe, alles selber zu checken, was Dein tolles Mini-CMS betrifft. Es funktioniert auch wunderbar und ließ sich ausbauen, aber ein Problem hab ich nun doch:

Wenn der aus XML eingelesene Text HTML-Formatierungen enthält, wird er, kaum eingelesen ins Flash-Interface, leider so dargestellt:

Irgendein Text aber dann das da.<br><br>Und die "Anführungszeichen" schreibt er leider so und dann gehts wieder weiter mit.<br><br>und so fort...

Ich habe versucht, die betreffenden Ausgabefelder HTML-mäßig zu enablen, aber leider ohne Erfolg. Meine Frage: was muss ich tun, damit der eingelesene Text mit normalen HTML-Zeichen dargestellt wird, also <br> für break usw.?

Ich wäre Dir wirklich sehr dankbar!
 
Hi,

Ich nehme an, Du wandelst die Tags schon PHP-seitig in "druckbare" Zeichen um. &gt; etc. dürfte eigentlich in Flash gar nicht ankommen.

Ich muss nochmal in meinem Archiv wühlen, und schauen, wie ich das damals gemacht habe; ich habe nämlich den Verdacht, dass ich das bewusst so umgewandelt habe, damit html-Fehler vom User nicht den XML-Baum kaputt hauen. ;)

Du könntest natürlich alle html-Entitäten in Flash vor dem Anzeigen in Tags umwandeln.

Gruß
.
 
Oh mein Gott: "Entitäten" sind - for all I know - die sprechenden Baumwesen aus "Herr der Ringe", Teil 2. Mit anderen Worten, ich weiss nicht, wie man das macht. Please pretty please help!
 
Hi,

probiers mal damit:
PHP:
var entities = new Array("&lt;", "&gt;", "&amp;", "&quot;", "&nbsp;", "lt;", "gt;", "amp;", "quot;", "nbsp;");
var codes = new Array("<", ">", "&", '"', " ", "<", ">", "&", '"', " ");

function parseEntities(obj) {
	var str = obj.toString();
	var ostr = "";
	var amp = false;
	for (var i=0; i<str.length; i++) {
		var tstr = str.substr(i, 1);
		var matching = false;
		for (var h=0; h<entities.length; h++) {
			if (str.substr(i, entities[h].length) == entities[h] && !matching) {
				matching = true;
				if (amp) {
					amp = false;
					if (tstr != "&") tstr = "&" + tstr;
				} else {
					if (codes[h] == "&") {
						if (!amp) {
							tstr = "";
							amp = true;
						}
					} else {
						tstr = codes[h];
					}
					i += entities[h].length - 1;
				}
			}
		}
		ostr += tstr;
	}
	return ostr;
}
Die Funktion parseEntities wandelt einen String voller &gt; &lt; &quot; usw. in lesbare Zeichen um. Natürlich kannst Du noch weitere Codes hinzufügen.

Gruß
.
 
Vielen lieben Dank, habs schon probiert, funktioniert aber noch nicht bei mir.

Ich habe Deinen Code im mc "details" hinzugefügt, nach
PHP:
this.onEnterFrame = function() {
  	if (node != undefined) {
  		parse();
  		delete this.onEnterFrame;
  	}
  }
  
  function parse() {
  	btext.text = node.attributes.bild;
  	etext.text = node.attributes.email;
  	ltext.text = node.attributes.link;
  	var ostr = "";
  	for (var i=0; i<node.childNodes.length; i++) {
  		ostr += node.childNodes[i];
  	}
  	dtext.text = ostr;
  }
 var entities = new Array("&lt;", "&gt;", "&amp;", "&quot;", "&nbsp;", "lt;", "gt;", "amp;", "quot;", "nbsp;");
  var codes = new Array("<", ">", "&", '"', " ", "<", ">", "&", '"', " ");
  
  function parseEntities(obj) {
  	var str = obj.toString();
  	var ostr = "";
  	var amp = false;
  	for (var i=0; i<str.length; i++) {
  		var tstr = str.substr(i, 1);
  		var matching = false;
  		for (var h=0; h<entities.length; h++) {
 			if (str.substr(i, entities[h].length) == entities[h] && !matching) {
  				matching = true;
  				if (amp) {
 					amp = false;
 				 if (tstr != "&") tstr = "&" + tstr;
  				} else {
  				    if (codes[h] == "&") {
 					 if (!amp) {
 						 tstr = "";
 						 amp = true;
  					    }
 					} else {
 					 tstr = codes[h];
  					}
 				 i += entities[h].length - 1;
  				}
  			}
  		}
  		ostr += tstr;
  	}
  	return ostr;
  }
Ist denn das richtig? Oder muss er woanders hin?
 
Ähem... Du musst die Funktion natürlich auch aufrufen:
PHP:
ostr += parseEntities(node.childNodes[i]);
:rolleyes:

Gruß
.
 
Im Ganzen also so?
PHP:
var entities = new Array("&lt;", "&gt;", "&amp;", "&quot;", "&nbsp;", "lt;", "gt;", "amp;", "quot;", "nbsp;");
  var codes = new Array("<", ">", "&", '"', " ", "<", ">", "&", '"', " ");
  function parseEntities(obj) {
  	var str = obj.toString();
  	var ostr = "";
  	var amp = false;
  	for (var i = 0; i<str.length; i++) {
  		var tstr = str.substr(i, 1);
  		var matching = false;
  		for (var h = 0; h<entities.length; h++) {
 			if (str.substr(i, entities[h].length) == entities[h] && !matching) {
  				matching = true;
  				if (amp) {
 					amp = false;
 					if (tstr != "&") {
 		 			tstr = "&"+tstr;
  					}
  				} else {
 					if (codes[h] == "&") {
 						if (!amp) {
 		 		 	tstr = "";
 		 		 	amp = true;
 						}
 					} else {
 		 			tstr = codes[h];
  					}
 					i += entities[h].length-1;
  				}
  			}
  		}
  		ostr += tstr;
  	}
  	return ostr;
  }
  ostr += parseEntities(node.childNodes[i]);
Aber wohin damit?
 
Neiin! ^^

An der neuen Funktion soll nichts geändert werden, Du musst sie nur in der Funktion "parse" aufrufen:
PHP:
  function parse() {
      btext.text = node.attributes.bild;
      etext.text = node.attributes.email;
      ltext.text = node.attributes.link;
      var ostr = "";
      for (var i=0; i<node.childNodes.length; i++) {
          ostr += parseEntities(node.childNodes[i]);
      }
      dtext.text = ostr;
  }

Gruß
.
 
Funktioniert! Das Laden der umgewandelten Texte dauert jetzt allerdings ca. 2 Sekunden, ist das normal?

Auf alle Fälle isses super.

Lieben Dank!
 
Zurück