Backslash aus Textarea in Arrayvariable retten
Günter Marchewka
- javascript
Guten Morgen,
ich habe ein Formular, in dem die Benutzer beliebig Text eingeben können sollen. Es kann neben reinem Text auch HTML-Code eingegeben werden. Dabei traten schon mal Probleme bei den größer und kleiner Zeichen auf, die ich jedoch mit dem folgenden Code lösen konnte. Jetzt ist jedoch jemand auf die Idee gekommen, einen Backslash einzugeben. Dieser wird als Ersetzungszeichen interpretiert und bei der Verarbeitung der eingegebenen Daten verschwindet er.
Nun habe ich versucht, eine Ersetzung wie bei den größer und kleiner Zeichen zu erreichen, es will jedoch nicht klappen.
Hier der Code:
function cEintrag()
{ alert('bin in cEintrag');
for (i=0;i< FEfelder.length;i++)
{
if (i == FEfelder.length) break;
xl = "<";
xlx=eval("/"+xl+"/g");
xg = ">";
xgx = eval("/"+xg+"/g");
xb = "\"; // doppelt, um einmal zu maskieren
alert('Bin vor eval für xbx');
xbx = eval("/"+xb+"/g");
alert('bin hinter eval für xbx');
document.all[FEfelder[i].feld].value = document.all[FEfelder[i].feld].value.replace(xlx,"<");
document.all[FEfelder[i].feld].value = document.all[FEfelder[i].feld].value.replace(xgx,">");
document.all[FEfelder[i].feld].value = document.all[FEfelder[i].feld].value.replace(xbx,"\");
FEvar[FEfelder[i].nr][FEfelder[i].name] = document.all[FEfelder[i].feld].value;
}
writeEintrag();
}
Dieser erzeugt in der mit alerts eingekreisten Anweisung im IE5.0 die Fehlermeldung: "/" erwartet.
Weis jemand, wie ich die Ersetzung des Backslash erreichen kann?
Ich habe schon herumprobiert und auch in der Anweisung xb = "\"; drei Backslashe (?) untergebracht. Da die Fehlermeldung darauf hin weist, das bei der Ausführung der eval-Anweisung ein Backslash fehlt. Das führt jedoch dazu, daß alle größer und kleiner Zeichen dauerhaft um einen Backslash erweitert werden. Stelle ich in der Reihenfolge der Ersetzungsanweisungen dann die letzte an die erste Stelle werden alle Backslashe durch "nichts" ersetzt.
Danke!
Günter
xl = "<";
xlx=eval("/"+xl+"/g");
xg = ">";
xgx = eval("/"+xg+"/g");
xb = "\"; // doppelt, um einmal zu maskieren
alert('Bin vor eval für xbx');
xbx = eval("/"+xb+"/g");
alert('bin hinter eval für xbx');
Dieser erzeugt in der mit alerts eingekreisten Anweisung im IE5.0 die Fehlermeldung: "/" erwartet.
Frage: Warum erzeugst du die Variablenwerte x?x mit eval? Reicht da nicht einfach die übliche Stringverkettung mit Plus (+). Dann brauchst du auch keine doppelte Definition der Variablen, sondern kannst statt x? gleich x?x definieren. Ich sehe da zumindest keinen Vorteil.
Und warum überhaupt Variablen definieren? Pack den Suchstring doch gleich in den Funktionsaufruf. Dann ist die Funktion auch schneller, weil sie nicht ständig (innerhalb der Schleife) Konstanten definieren muß.
- Sven Rautenberg
Hallo Sven,
Frage: Warum erzeugst du die Variablenwerte x?x mit eval? Reicht da nicht einfach die übliche Stringverkettung mit Plus (+). Dann brauchst du auch keine doppelte Definition der Variablen, sondern kannst statt x? gleich x?x definieren. Ich sehe da zumindest keinen Vorteil.
Und warum überhaupt Variablen definieren? Pack den Suchstring doch gleich in den Funktionsaufruf. Dann ist die Funktion auch schneller, weil sie nicht ständig (innerhalb der Schleife) Konstanten definieren muß.
Nun ich bin nicht der Guru für solche Ersetzungen und habe mich daher an den Tip von Antje Hofmann aus dem Archiv gehalten:
http://forum.de.selfhtml.org/archiv/2000_1/t10046.htm#a50672
Der klang schon so, das dies eine gute Lösung ist. Hinsichtlich der Geschwindigkeit sind keine Einbußen merkbar.
Mein Problem würde aber immer noch bestehen, wenn ich den Suchstring direkt in den Funktionsaufruf packen würde, die Logik ist doch dann nicht anders oder?
Gruß und Danke
Günter
Hallo Sven,
Nun ich bin nicht der Guru für solche Ersetzungen und habe mich daher an den Tip von Antje Hofmann aus dem Archiv gehalten:
http://forum.de.selfhtml.org/archiv/2000_1/t10046.htm#a50672
Der löst aber ein anderes Problem als deines. Die Lösung dort sorgt dafür, daß man den Wert, der ersetzt werden soll, variabel angeben kann. Du willst aber nach festen Werten suchen.
Der klang schon so, das dies eine gute Lösung ist. Hinsichtlich der Geschwindigkeit sind keine Einbußen merkbar.
Die Geschwindigkeitsunterschiede merkst du auch erst dann, wenn du eine andere Variante damit vergleichst und zweitens natürlich erst dann, wenn die Schleife häufig durchlaufen wird.
Mein Problem würde aber immer noch bestehen, wenn ich den Suchstring direkt in den Funktionsaufruf packen würde, die Logik ist doch dann nicht anders oder?
"Würde"? Noch nicht getestet?
Erst testen, dann rückmelden. :)
Gruß und Danke
Günter
- Sven Rautenberg
Hallo Sven,
Die Geschwindigkeitsunterschiede merkst du auch erst dann, wenn du eine andere Variante damit vergleichst und zweitens natürlich erst dann, wenn die Schleife häufig durchlaufen wird.
Nun ich kann Dir versichern, das ich das getestet habe. Die Funktion läuft nicht merklich schneller ab, wenn man das gesamte Ersetzen entfernt. Es geht hier nicht um Megabytes und Optimierung der Performance ist zur Zeit nicht mein Problem.
"Würde"? Noch nicht getestet?
Erst testen, dann rückmelden. :)
Nun auch hier kann ich Dir bestätigen, das Deine Lösung sich genau so verhält, wie Antje es in ihrem Posting erwähnt hat. Es wird nur das erste Zeichen ersetzt alle weiteren nicht. Die in dem Posting weiter unten erwähnte Lösung ohne eval habe ich auch getestet. Das Ergebnis ist identisch (auch hinsichtlich der Performance), daher bin ich darauf nicht weiter eingegangen.
Gruß und Danke
Günter
Hallo Sven,
Die Geschwindigkeitsunterschiede merkst du auch erst dann, wenn du eine andere Variante damit vergleichst und zweitens natürlich erst dann, wenn die Schleife häufig durchlaufen wird.
Nun ich kann Dir versichern, das ich das getestet habe. Die Funktion läuft nicht merklich schneller ab, wenn man das gesamte Ersetzen entfernt. Es geht hier nicht um Megabytes und Optimierung der Performance ist zur Zeit nicht mein Problem.
Ich sehe eine Schleife und darin Konstantendefinitionen. Das ist schlechter Programmierstil und sollte nicht angewandt werden. Und solange du keine Funktion zum Messen der Rechenzeit einbaust, wirst du bei ein oder zwei Durchläufen auch keinen Unterschied "merken". Der Hinweis war ganz generell zu verstehen: Konstantendefinitionen gehören nicht in Schleifen.
"Würde"? Noch nicht getestet?
Erst testen, dann rückmelden. :)
Nun auch hier kann ich Dir bestätigen, das Deine Lösung sich genau so verhält, wie Antje es in ihrem Posting erwähnt hat. Es wird nur das erste Zeichen ersetzt alle weiteren nicht. Die in dem Posting weiter unten erwähnte Lösung ohne eval habe ich auch getestet. Das Ergebnis ist identisch (auch hinsichtlich der Performance), daher bin ich darauf nicht weiter eingegangen.
Wo ist das Problem?
string.replace(/</g,"$lt;") ersetzt global alle "<" in "<".
Gruß und Danke
Günter
- Sven Rautenberg
Hallo Sven,
Wo ist das Problem?
string.replace(/</g,"$lt;") ersetzt global alle "<" in "<".
Die Schreibweise war das Problem. Verhaftet an der Schreibweise in dem Posting aus dem Archiv habe ich diese Art der Schreibweise nicht ausprobiert.
Du hast mir sehr geholfen!
Gruß und Danke
Günter
P.S.: Das mit dem Programmierstil nehm ich mir zu Herzen.