Wie krieg ich ein replace für einen string?

Ja, ich weiss. Bei festen strings gehts bei mir auch.
Aber irgendwo ist bei dem auslesen noch ein Bock drin.

Danke für Deine Mühe!

Nun müsste ich nich die Lösung finden für „Frau Dr.“
Dabei wird der Nachname verschluckt. „Frau“ geht.

Das kann nicht sein.

„Sehr geehrte Frau Dr. ,“.replace(/^(\w+(\s+\w+.?(-\w+.?)*)*)\s*,/, „$1 Mustermann,“)

ergibt erwartungsgemäß „Sehr geehrte Frau Dr. Mustermann,“.

Kannst du das Verschlucken mit einem Codebeispiel belegen? So ist das nicht nachvollziehbar.

Was den RegExp angeht: Es wird (wie du schon sagst) am Anfang der Zeichenkette gesucht (^), dann muss ein Wort kommen (\w+), danach ein Leeraum (\s+) wieder gefolgt durch ein Wort, ggf. mit Punkt dahinter (.?) und möglicherweise gefolgt von einem Bindestrich und einem weiteren Wort mit optionalem Punkt dahinter. Die inneren Gruppen können beliebig oft aber auch gar nicht wiederholt werden. Die äußere Gruppe umfasst alles außer dem Komma und dem eventuellen Leerraum direkt davor, weswegen sie als Ersetzung ($1) verwendet werden kann.

Ah, OK, war mein Fehler. In der Vorbelegung via php fehlte das Komma hinter Frau Dr. ,

Fette Dankeschön nochmal!
Das heisst ?(…) heisst es könnte noch ein Wort \w kommen mit Leerzeichen \s usw.?

Wenn es zb eine Frau Dr Dr med Pro gibt…
Aber damit komme ich erstmal weiter!

Danke!

Das heisst ?(…) heisst es könnte noch ein Wort \w kommen mit
Leerzeichen \s usw.?

Ja, das passt für „Hallo,“ (=> „Hallo Petra,“) genau so wie für „Liebster über alles geschätzter Herr Dr. Dr.-Ing. rer. nat. phil. ,“ (=> „Liebster über alles geschätzter Herr Dr. Dr.-Ing. rer. nat. phil. Finkenbach,“). Es darf nur kein Komma mehr dazwischen sein, also „Liebste, hochgeachtete Frau,“ geht nicht.

Spitzen Sache! Danke schön! Und wieder was gelernt!

Zusatzfrage:
Es kann sein, dass es zB keinen Ansprechpartner gibt (Firmen wie Amazon).
In dem Fall kann der user mit „tab“ durchwählen das Feld einfach unangetastet lassen. (Übergehen mit der Maus lass ich erstmal außen vor).
Da greift natürlich onchange nicht. Das habe ich nun durch onblur ersetzt.

Dann alles bis zum Komma durch „Sehr geehrte Damen und Herren“, ersetzten. Das tut auch soweit.

Da habe ich allerdings das Problem, dass wenn der user sich zB vertippt hat, zufällig oder aus sonst einem Grund nochmal in das Textfeld tabt, führt der mir das Ganze nochmal aus.
Bei php würde ich einfach nen Zähler setzen und den hochzählen. if(var x==1)…
x++;

Das geht hier aber nicht, da das Ganze ja mittels eventhandler aufgerufen wird und ich die Variable/den Zähler beim jeden Laden der Seite initialisieren muss.
Damit ist die Bedingung x==1 immer erfüllt.

Eine Idee ist gerade, das Ganze in eine Funktion zu packen und vor Funktionsaufruf den Zähler zu prüfen.

Sorry fürs nachlegen. Hoffe, das ist OK.

Zusatzfrage:

Da ist keine Frage enthalten, nur eine Zusammenfassung, was du vorhast. Ich könnte dir dabei jetzt viel Spaß wünschen, sonst gibt es nicht viel zu sagen.

Eins noch: auch in JS kannst du Zähler benutzen. Sie müssen nur außerhalb der Funktion deklariert sein, dann kannst du sie auch innerhalb nutzen.

Nun gut,
die Frage war: Wie verhindere ich eine erneute Ausführung? Also wirklich Funktion…
Weil so habe ich zB:
###########
Sehr geehrter Herr Musermann Mussermann Mustermann,

mfG

Oliver…
###########

Das passiert halt wenn der User ohne reload mehrfach ins Feld klickt, bzw. ins nachfolgende wechselt.

Im Prinzip ist das mit der Vorbelegung/Ersetzung sowieso Schrott. Das mehrfache Ausführen kannst du aber (wie du selbst schon sagtest) mit einem Zähler oder einem Flag verhindern. Wie bzw. wo du den initialisieren musst, habe ich dir geschrieben. Insofern verstehe ich deine Frage nicht.

Als Mann vom Fach solltest du doch über solchen Anfängerkram langsam hinaus sein und wissen, wie man es richtig macht und auch so, dass es vor Manipulationen geschützt ist. Wenn das öffentlich sein soll, kann da sowieso jeder reinhacken, was er möchte und Besucher ohne aktiviertes JS bekommen dort auch nichts ersetzt. Wenn du jetzt sagst, dass es eine interne Seite ist und du den Mitarbeitern vertraust, kannst du denen auch ohne Zähler beibringen, dass sie nicht zweimal dort reinklicken.

Du merkst, dein ganzes Vorgehen ist irgendwie absurd. Du willst etwas verhindern, das so leicht umgangen werden kann, dass diese Maßnahme total sinnlos ist. So ähnlich wie eine Panzertür, die einfach so mitten auf einer Wiese steht.

Hi,
also:
Eigentlich ist php mein Gebiet. js habe ich bisher wenn möglich vermieden oder einfach nur eingesetzt.

Das ganze soll intern laufen. Und da setzte ich js einfach mal voraus. Ohne js geht heute doch eh fast nichts mehr.
Natürlich kann alles umgangen werden. Darum gehts mir auch nicht, wer will kriegt auch MS Office zum Absturz.
Daher finde ich persönlich auch die Überprüfung von Eingabefeldern Humbug. Tippfehler wie Leerzeichen werden vielleicht gefunden, aber Bill Getes statt Bill Gates nicht.

Aber gut, dass sind alles philosophische Fragen.

Zurück zu meinem urspünglichen Problem. php läuft auf dem Server, js auf dem client. php arbeitet ein script ab. Damit kann ich ohne reload nicht in einer Seite „springen“. und sowas wie eventhandler (onklick, usw.) gibts meines Wissens auch nicht.

Was ich möchte ist eine Möglichkeit, dass jemand ein Formular ausfüllt und dem Benutzer die Arbeit soweit wie möglich abgenommen wird.

Also Name eingegeben, Absender eingegeben und die Werte werden sofort nach verlassen im Nachrichtenfeld vorgegeben. Gleiches für die Anredenfloskel.

Anderer Ansatz: Ich müsste komplett trennen und den Absender fix machen und für den Namen gibts nur eine select Liste. Aber wenn ein Empfänger nicht erfasst ist, muss ich den erst erfassen. Und das möchte ich eigentlich in einem Rutsch machen.
Daher habe ich zB auch eine Variable neuodernicht definiert. Wenn 1 dann kommt das Formular, wenn 0 kommt eine select Liste.

Wenn ich den Absender bereits kenne, ists kein Thema, dann ich das textarea besser vorbelegen.
Wenn nicht, kenn ich den erst nach der Eingabe. Aber da ist php schon am Ende…

Man könnte es natürlich auch bei der pdf-Generierung zusammenbauen, aber dann siehts der User zu spät.

Ganz einfach Name eingeben, nächstes Feld und dann wird das Textfeld aktualisiert…

Okay, aber warum dieser Ersetzungskram? Was spricht denn dagegen, ein vorbelegtes Feld für die Anrede zu haben (meinetwegen auch als Drop-Down und dahinter ein normales Textfeld für den Namen?

[Sehr geehrte Frau Dr.|▼] [\_\_\_\_\_\_\_\_\_\_\_\_\_],

Dann kannst du dir den Ersetzungskram sparen.

Weil der Empfänger nicht unbedingt vorher bekannt ist.
Simples Beispiel:
Thomas Mustermann interessiert sich für einen Anfängerkurs fürs tanzen
Die Tanzschule schreibt dem schriftlich zurück.
Damit man nach 6 Wochen auch noch nachvollziehen kann, was wer wem geschrieben hat, möchte ich es in einer Datenbank haben.
Aber Thomas Mustermann ist nicht in der Datenbank. Dann müsste erst Thomas Mustermann erfasst werden und dann ein Infoschreiben rausgehen.

Und da war mein Ansatz, ob man nicht irgendwie den Mustermann der zumindest temporär bekannt ist, sobald das Feld Nachnahme, Anrede und Titel ausgefüllt ist, das Ganze vorgeben kann.

Aber ich glaube Du hast Recht. Vielleicht wirds so auch zu unflexibel. Denn es könnte ja sein, dass der Anfragende ein Jugendlicher ist und statt Sehr geehrter Herr Mustermann, einfach ein Hallo Thomas vorgezogen wird…
Oder ich nehms als Vorschlag. Dann kann man es ja immer noch ändern. Der nächste Schritt wäre ein wysiwyg Eingabefenster, damit man auch sowas wie fettschrift und " verwenden kann…

Danke für Deine Mühe / Hilfe / Anregungen!

hi!

dein script funktioniert doch wie es soll…
du machst es nur absolut falsch…

so wie du es machst:
in deinem textfeld steht ‚test‘ - dann soll der laut script in ‚test‘ das wort/satz 'sehr geehrter herr dr. ’ durch ‚sehr geehrter herr dr test‘ ersetzen. das kann der aber nicht finden da in der altevariable nur ‚test‘ steht…

wenn du das ersetzen möchtest sollte das so aussehen
var neuevariable = teilinhalt.replace(teilinhalt,inhalt);

und das wars.

grüße
matze

Hi Matze,

danke für Deine Antwort! Ich habs nun lösen können. War ein Tippfehler bzw. Leerzeichen drin.

Aber nun bin ich schon am überlegen das ganze zu canceln. Denn zuviele Variationen machen es arg kompliziert. ZB Wenn es keinen Namen gibtm, weil zB nur ein Firmenname existiert. Oder ein Firmenname + Ansprechpartner oder ein Titel . Dann muss ich onfocus statt onchange nehmen. Aber dann habe ich den ersetzten Wert doppelt drin…

Plan war Textfeld name und textarea mit String schnipsel. Und dann je nach Situation. ersetzten…

Ich muss mal schauen ob das wirklich Sinn macht. Ist doch genau wie der body im mail-link… Kann man nutzen, muss man aber nicht…
Gruß
Oliver

servus!

ja das macht vermutlich wenig sinn so wie du das geplant hast.
wenn du kannst mach doch einfach diskrete eingabefelder. machts einfacher.

grüße

Das textfeld ist halt vorbelegt mit Sehr geehrter Herr Dr.,
Und das ganze soll ersetzt werden durch den im Textfeld
eingegeben Nachnamen. ZB Sehr geehrter Herr Dr. Mustermann,
Danke für eure Mühe

Ersteinmal weiß ich zwar nicht, was das für einen Sinn hat, aber möglich ist das schon. Wenn du allerdings in der JavaScript-Referenz von SelfHTML nachsiehst, braucht die replace-Funktion eine RegExp-Beschreibung als ersten Parameter.
Hier findest du die Replace-Funktion mit Beispiel: SelfHTML JavaScript Strings
Und hier findest du umfangreichere Informationen über RegExp: SelfHTML Perl RegExp-Referenz

Außerdem sollte auf das Leerzeichen hinter Dr. geachtet werden, das war meine erste These, da zwei unterschiedliche Varianten in der Anfrage standen.

Viele Grüße,
Endres

Danke für Deine Antwort.
Ist halt wegen der Usability. Der DAU klickt drauf und freut sich wenn er weniger tippen muss. Zudem verhindere ich so etwa die Tippfehlergefahr.
Gruß
Oliver

Wenn du das Komma hinter der Anrede beim replace ignorierst, sollte es klappen:

var anrede=‚Sehr geehrter Herr Dr.‘;
var nname=document.getElementById(‚nachname‘).value;
var anrede_komplett=anrede+’ '+nname;
var text=document.getElementById(‚nachrichtentextfeld‘).value;
var text_komplett=text.replace(anrede, anrede_komplett);
alert(text_komplett);

Das funktioniert natürlich nur, wenn im Textfeld ‚Sehr geehrter Herr Dr.‘ nach wie vor unverändert drinsteht. Bei Frauen und Nicht-Akademikern ist das Skript sinnlos.

JavaScript arbeitet mit regulären Ausdrücken nicht mit Strings:

var ausdruck = new RegExp(teilinhalt.replace(new RegExp(’[.\\+*?\[\^\]$(){}=!|:\-]’, ‚g‘), ‚\$&‘));
var neuevariable=alterinhalt.replace(ausdruck,inhalt);

Aber eigentlich sollte das mit deinem Script auch funktionieren - vorausgesetzt, der gesuchte Text steht auch Zeichen für Zeichen (inklusive Leerzeichen und Komma) in alterinhalt.

Falls das nicht funktioniert, kannst Du es noch mit einer Kombination aus indexOf und substr versuchen.

Auf Nummer Sicher gehst Du aber, wenn du besser erkennbare Platzhalter verwendest, z.B. „“ statt "Sehr geehrter Herr Dr. "

Danke für Deine Antwort. Habs nun gelöst. War etwas Umfangreicher, da bei einer einfachen Lösung das Skript bei zB Dr. Dr. oder Dipl-Ing. versagt hätte.
Zudem gibt es auch den Fall, wo es keine Ansprechperson gibt, zB bei Amazon etc.
Da müsste dann alles durch Sehr geehrte Damen und Herren ersetzt werden.
Aber nun tut es.