Buchstaben im Textfeld umwandeln
Hallo,
ich versuche gerade, ein Script zu schreiben, welches mir Buchstaben, die in ein Textfeld eingegeben werden, in Echtzeit umwandelt. Dazu habe ich bisher folgendes gefunden:
function SuchenUndErsetzen(QuellText, SuchText, ErsatzText)
{
if ((QuellText == null) || (SuchText == null)) { return null; }
if ((QuellText.length == 0) || (SuchText.length == 0)) { return QuellText; }
if ((ErsatzText == null) || (ErsatzText.length == 0)) { ErsatzText = ""; }
var LaengeSuchText = SuchText.length;
var LaengeErsatzText = ErsatzText.length;
var Pos = QuellText.indexOf(SuchText, 0);
while (Pos >= 0)
{
QuellText = QuellText.substring(0, Pos) + ErsatzText + QuellText.substring(Pos + LaengeSuchText);
Pos = QuellText.indexOf(SuchText, Pos + LaengeErsatzText);
}
return QuellText;
}
Und dann im HTML:
<INPUT TYPE="TEXT" NAME="SucheNach" VALUE="a" size="20">
<INPUT TYPE="TEXT" NAME="ErsetzeDurch" VALUE="b" size="20">
<INPUT TYPE="TEXT" NAME="Ergebnis" onkeydown="this.form.Ergebnis.value=SuchenUndErsetzen(this.form.Ergebnis.value, this.form.SucheNach.value, this.form.ErsetzeDurch.value)" onchange="this.form.Ergebnis.value=SuchenUndErsetzen(this.form.Ergebnis.value, this.form.SucheNach.value, this.form.ErsetzeDurch.value)" size="20">
Das funktioniert soweit, es wird der Buchstabe "a" durch den Buchstaben "b" ersetzt, wenn ich etwas ins Textfeld eingebe. Nun ist meine Frage aber, wie kann ich das ganze mit mehr Buchstaben machen? Es müssen also alle 26 Buchstaben plus einige Sonderzeichen eine Ersetzung erhalten.
Würde mich freuen, wenn mir jemand helfen könnte.
Schönen Gruß,
Üsch
Antwort schreiben
Antwort 1 von gast42 vom 06.01.2022, 16:03 Options
Wozu willst du Buchstaben in Zeit umwandeln? andere Buchstaben tun's doch auch ;-)
function SuchenUndErsetzen(QuellText, SuchText, ErsatzText) {
SuchText=SuchText.split("");
ErsatzText=ErsatzText.split("");
var maximal=Math.min(SuchText.length,ErsatzText.length);
for (var i=0;i<maximal;i++ {
var reggy=new RegExp(SuchText[i],g);
QuellText=QuellText.replace(reggy,Ersatztext[i]);
}
return QuellText;
}
Ablauf:
die beiden Strings Such + Ersatz werden per split() in Arrays ihrer Zeichen gewandelt.
Sollte eins länger sein als das andere wird sicherheitshalber die Länge des kürzeren Arrays verwendet. Alle Zeichen des Suchstrings werden nacheinander (in einer for-Schleife) in einen regulären Suchausdruck umgewandelt.
In replace() wird damit jede Stelle des Quell-Strings durch das ensprechende Zeichen aus Ersatz ersetzt.
Antwort 2 von gast42 vom 06.01.2022, 16:04 Options
function SuchenUndErsetzen(QuellText, SuchText, ErsatzText) {
SuchText=SuchText.split("");
ErsatzText=ErsatzText.split("");
var maximal=Math.min(SuchText.length,ErsatzText.length);
for (var i=0;i<maximal;i++) {
var reggy=new RegExp(SuchText[i],g);
QuellText=QuellText.replace(reggy,Ersatztext[i]);
}
return QuellText;
}
) fehlte!
Antwort 3 von gast43 vom 06.01.2022, 16:39 Options
es muss
new RegExp(SuchText,"g")
lauten!
Antwort 4 von Uesch vom 07.01.2022, 03:41 Options
Hallo gast 42 und 43. Vielen Dank für Eure Hilfe.
Würde der HTML-Code denn dann so aussehen?
<INPUT TYPE="TEXT" NAME="SucheNach" VALUE="abc" size="20">
<INPUT TYPE="TEXT" NAME="ErsetzeDurch" VALUE="def" size="20">
<INPUT TYPE="TEXT" NAME="Ergebnis" onkeydown="SuchenUndErsetzen(this.form.Ergebnis.value, this.form.SucheNach.value, this.form.ErsetzeDurch.value)" size="20">
Soweit ich das verstanden habe, könnte ich also als SuchText "abcdefghi" eingeben und als ErsatzText "jklmnopqr" und dann würde er zum Beispiel alle "c" im QuellText durch "l" ersetzen. Stimmt das?
Mit dem HTML-Code oben passiert leider gar nichts. Vielleicht ist er aber auch nicht ganz richtig?
Gruß, Üsch
Antwort 5 von gast42 vom 07.01.2022, 06:33 Options
Zitat:
SuchenUndErsetzen(this.form.Ergebnis.value, this.form.SucheNach.value, this.form.ErsetzeDurch.value)
ruft die Funktion mit den genannten Parametern auf, die Funktion arbeitet brav (andernfalls Firefox-Fehlerkonsole!), die Funktion liefert einen Rückgabewert - den rufst du niemals auf.
evtl. tut:
this.value=SuchenUndErsetzen(this.value, this.form.SucheNach.value, this.form.ErsetzeDurch.value)
das was du willst.
Antwort 6 von Uesch vom 07.01.2022, 14:27 Options
Hallo,
danke, das hatte ich vergessen. Was er jetzt aber macht, ist dass bei Eingabe von "abc" und "def" gar nichts passiert und nur dann was passiert, wenn ich "a" und "b" bzw. "a" und "bcde" eingebe (bei beiden wird das "a" durch das "b" ersetzt.
Firefox-Fehlerkonsole sagt gar nix.
Woran kann das liegen?
Antwort 7 von gast42 vom 07.01.2022, 19:41 Options
bitte beschreibe deine Vorgehensweise nachvollziehbar!
Antwort 8 von Uesch vom 07.01.2022, 22:45 Options
Also:
HTML-Code:
<FORM>
<INPUT TYPE="TEXT" NAME="SucheNach" VALUE="abc" size="20">
<INPUT TYPE="TEXT" NAME="ErsetzeDurch" VALUE="def" size="20">
<INPUT TYPE="TEXT" NAME="Ergebnis" onkeydown="this.value=SuchenUndErsetzen(this.value, this.form.SucheNach.value, this.form.ErsetzeDurch.value)" size="20">
</FORM>
Javascript:
function SuchenUndErsetzen(QuellText, SuchText, ErsatzText) {
SuchText=SuchText.split("");
ErsatzText=ErsatzText.split("");
var maximal=Math.min(SuchText.length,ErsatzText.length);
for (var i=0;i<maximal;i++) {
var reggy=new RegExp(SuchText,"g")
QuellText=QuellText.replace(reggy,ErsatzText[i]);
}
return QuellText;
}
Nun steht im Feld SucheNach der Wert "abc" und im Feld ErsetzeDurch der Wert "def". Bei Eingabe von beispielsweise "Haus" im Feld "Ergebnis" passiert gar nichts. Wenn ich nun aber im Feld SucheNach "a" und im Feld ErsetzeDurch "b" oder auch "bcd" eingebe, wird das "a" von "Haus" durch ein "b" ersetzt. Es funktioniert also bei einem Buchstaben im Feld SucheNach, nicht aber bei mehreren.
Hmm, da ist zwar irgendwie noch ein fehler, aber es funktioniert trotzdem...vielleicht findest du ihn ja...
<html>
<head>
<script type="text/javascript">
function SuchenUndErsetzen(QuellText, SuchText, ErsatzText, SuchText1, ErsatzText1, SuchText2, ErsatzText2, SuchText3, ErsatzText3, SuchText4, ErsatzText4) {
SuchText=SuchText.split("");
ErsatzText=ErsatzText.split("");
var maximal=Math.min(SuchText.length,ErsatzText.length);
for (var i=0;i<maximal;i++) {
var reggy=new RegExp(SuchText,"g")
QuellText=QuellText.replace(reggy,ErsatzText);
var reggy=new RegExp(SuchText1,"g")
QuellText=QuellText.replace(reggy,ErsatzText1);
var reggy=new RegExp(SuchText2,"g")
QuellText=QuellText.replace(reggy,ErsatzText2);
var reggy=new RegExp(SuchText3,"g")
QuellText=QuellText.replace(reggy,ErsatzText3);
var reggy=new RegExp(SuchText4,"g")
QuellText=QuellText.replace(reggy,ErsatzText4);
}
return QuellText;
}
</script>
</head>
<body>
<FORM>
Ersetze: <INPUT TYPE="TEXT" NAME="SucheNach" VALUE="a" size="1">
durch: <INPUT TYPE="TEXT" NAME="ErsetzeDurch" VALUE="1" size="1"> <br/>
Ersetze: <INPUT TYPE="TEXT" NAME="SucheNach1" VALUE="e" size="1">
durch: <INPUT TYPE="TEXT" NAME="ErsetzeDurch1" VALUE="2" size="1"> <br/>
Ersetze: <INPUT TYPE="TEXT" NAME="SucheNach2" VALUE="i" size="1">
durch: <INPUT TYPE="TEXT" NAME="ErsetzeDurch2" VALUE="3" size="1"> <br/>
Ersetze: <INPUT TYPE="TEXT" NAME="SucheNach3" VALUE="o" size="1">
durch: <INPUT TYPE="TEXT" NAME="ErsetzeDurch3" VALUE="4" size="1"> <br/>
Ersetze: <INPUT TYPE="TEXT" NAME="SucheNach4" VALUE="u" size="1">
durch: <INPUT TYPE="TEXT" NAME="ErsetzeDurch4" VALUE="5" size="1">
<br/><br/>
Ergebnis: <INPUT TYPE="TEXT" NAME="Ergebnis" onkeydown="this.value=SuchenUndErsetzen(this.value, this.form.SucheNach.value, this.form.ErsetzeDurch.value, this.form.SucheNach1.value, this.form.ErsetzeDurch1.value, this.form.SucheNach2.value, this.form.ErsetzeDurch2.value, this.form.SucheNach3.value, this.form.ErsetzeDurch3.value, this.form.SucheNach4.value, this.form.ErsetzeDurch4.value)" size="20">
</FORM>
</body>
</html>
Antwort 10 von Uesch vom 08.01.2022, 03:16 Options
Vielen Dank supporter2010! Es funktioniert wunderbar und ich habe es nun nach 5 Stunden Schreibarbeit für über 50 Buchstaben gemacht und in ein bestehendes Skript eingebaut. Also vielen Dank nochmal!
Antwort 11 von gast42 vom 08.01.2022, 06:44 Options
was für eine Verschlimmbesserung (Murks!) von supporter2010!
du hattest nur ein unterschlagen:
function SuchenUndErsetzen(QuellText, SuchText, ErsatzText) {
SuchText=SuchText.split("");
ErsatzText=ErsatzText.split("");
var maximal=Math.min(SuchText.length,ErsatzText.length);
for (var i=0;i<maximal;i++) {
var reggy=new RegExp(SuchText[i],"g")
QuellText=QuellText.replace(reggy,ErsatzText[i]);
}
return QuellText;
}
ja, das mit dem Suchtext- / Ersatztext-Index war meine eigentliche Absicht, aber das habe ich gestern verpeilt...
Damit Du nicht nochmal 5h zum Ändern brauchst, hier nochmal komplett und formatiert:
<!DOCTYPE html>
<html>
<head>
<style type="text/css">
input{position:fixed; left:70px;}
</style>
<script type="text/javascript">
function SuchenUndErsetzen(QuellText, SuchText, ErsatzText) {
SuchText=SuchText.split("");
ErsatzText=ErsatzText.split("");
var maximal=Math.min(SuchText.length,ErsatzText.length);
for (var i=0;i<maximal;i++) {
var reggy=new RegExp(SuchText,"g")
QuellText=QuellText.replace(reggy,ErsatzText);
}
return QuellText;
}
</script>
</head>
<body>
<FORM>
Ersetze: <INPUT TYPE="TEXT" NAME="SucheNach" VALUE="a" size="20"/>
<br/>
durch: <INPUT TYPE="TEXT" NAME="ErsetzeDurch" VALUE="1" size="20"/>
<br/><br/>
Ergebnis: <INPUT TYPE="TEXT" NAME="Ergebnis" onkeydown="this.value=SuchenUndErsetzen(this.value, this.form.SucheNach.value, this.form.ErsetzeDurch.value)" size="20"/>
</FORM>
</body>
</html>
sorry, irgendwas ist beim kopieren schief gegangen...hier nochmal... (kann ich meine Postingd eigentlich nicht löschen):
<!DOCTYPE html>
<html>
<head>
<style type="text/css">
input {position:fixed; left:70px;}
</style>
<script type="text/javascript">
function SuchenUndErsetzen(QuellText, SuchText, ErsatzText) {
SuchText=SuchText.split("");
ErsatzText=ErsatzText.split("");
var maximal=Math.min(SuchText.length,ErsatzText.length);
for (var i=0;i<maximal;i++) {
var reggy=new RegExp(SuchText,"g")
QuellText=QuellText.replace(reggy,ErsatzText);
}
return QuellText;
}
</script>
</head>
<body>
<FORM>
Ersetze: <INPUT TYPE="TEXT" NAME="SucheNach" VALUE="a" size="20"/>
<br/>
durch: <INPUT TYPE="TEXT" NAME="ErsetzeDurch" VALUE="1" size="20"/>
<br/><br/>
Ergebnis: <INPUT TYPE="TEXT" NAME="Ergebnis" onkeydown="this.value=SuchenUndErsetzen(this.value, this.form.SucheNach.value, this.form.ErsetzeDurch.value)" size="20"/>
</FORM>
</body>
</html>
Antwort 15 von son_quatsch vom 08.01.2022, 10:14 Options
Ich bin ja dafür, standardmäßig eine deselektierte Checkbox zu haben "Beitragsformatierung aktivieren". Dann passiert den meisten Leuten auch nicht immer "irgendwas ist beim kopieren schief gegangen", wenn sie Quellcode mit eckigen Klammern posten, ohne diesen selbst in Formatierung zu setzen.
Für registrierte Mitglieder kann der Status jener Checkbox ja gespeichert werden. Und sie müssen es selbst selektieren (hoffentlich erst nachdem sie wissen, was Beitragsformatierung ist).
nee, das forum unterschlägt da was...is ja blöd...
var reggy=new RegExp(SuchText[ i ],"g")
QuellText=QuellText.replace(reggy,ErsatzText[ i ]);
[ i ], also "eckige Klammer i eckige Klammer" wird hinter SuchText und hinter ErsatzText unterschlagen (wenn man keine Leerzeichen einfügt)...
sorry
Antwort 17 von gast42 vom 08.01.2022, 19:40 Options
Zitat:
nee, das forum unterschlägt da was...is ja blöd...
nur wenn du es unterlässt Quellcode als solchen zu kennzeichnen, dafür ist der Button
Code über dem Textfeld da
Antwort 18 von gast42 vom 08.01.2022, 19:43 Options
by the way, was soll
Zitat:
<!DOCTYPE html>
darstellen?
Antwort 20 von gast42 vom 09.01.2022, 18:50 Options
da die
Zitat:
html5 Doctype Deklaration....
alle aktuellen Browser in den Quirksmodus schickt wäre eine aktuelle (HTML4,XHTML1) wohl sinnvoller...