5.6k Aufrufe
Gefragt in Skripte(PHP,ASP,Perl...) von uesch Mitglied (135 Punkte)
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

23 Antworten

0 Punkte
Beantwortet von
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.
0 Punkte
Beantwortet von
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!
0 Punkte
Beantwortet von
es muss
new RegExp(SuchText[i],"g")
lauten!
0 Punkte
Beantwortet von uesch Mitglied (135 Punkte)
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
0 Punkte
Beantwortet von
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.
0 Punkte
Beantwortet von uesch Mitglied (135 Punkte)
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?
0 Punkte
Beantwortet von
bitte beschreibe deine Vorgehensweise nachvollziehbar!
0 Punkte
Beantwortet von uesch Mitglied (135 Punkte)
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.
0 Punkte
Beantwortet von Experte (6.4k Punkte)
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>
0 Punkte
Beantwortet von uesch Mitglied (135 Punkte)
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!
...