PHP preg_replace ersetzt Umlaute

Pfandfinder

Lieutenant
Registriert
Nov. 2020
Beiträge
645
ich nutze diese "Funktion" um namen korrekt auszugeben, falls z.b. emojis in der Variable sind, die dann entfernt werden. jetzt ist mir aber auch aufgefallen dass aus z.b. "Müller" "Mller" wird. wie ändere ich das ?

PHP:
trim(ucfirst(str_replace('?', '', preg_replace('/[0-9]+/', '', preg_replace('/[^A-Za-z0-9 ]/', '', $name)))))
 
Spontan hätte ich jetzt das hier versucht:

PHP:
trim(ucfirst(str_replace('?', '', preg_replace('/[0-9]+/', '', preg_replace('/[^A-Za-z0-9Ä-Üa-ü ]/', '', $name)))));
 
geht nicht. hab das gefunden das geht

/[^\p{L}\p{N} ]/u

noch ne frage, kann ich die 2 preg_replace jetzt noch zu einem zusammenfassen ?
 
Ich bin in PHP nicht wirklich bewandert. Obige Lösung habe ich nur aus dem Ärmel geschüttelt und bei tehplayground ausprobiert. Da funktioniert es. Zumindest so wie ich verstanden habe wie es deiner Meinung nach funktionieren sollte.
Ergänzung ()

Pfandfinder schrieb:
kann ich die 2 preg_replace jetzt noch zu einem zusammenfassen ?
Prinzipiell ersetzt das erste bzw äußere preg_replace alle 0-9 mit einem leeren String und das zweite bzw. innere preg_replace ersetzt alles was KEIN Buchstabe bzw. Zahl ist ebenfalls mit einem leeren String. Sogesehen würde ich behaupten, dass das erste bzw. äußere preg_replace überflüssig wäre, wenn du im inneren die 0-9 rausnimmst, weil dann nur alles was KEIN Buchstabe ist - gilt also auch für Zahlen - gematcht wird.

Im übrigen ist vermutlich auch das str_replace überflüssig, da es ? ersetzt, was ebenfalls kein Buchstabe ist.

Alles in allem sollte das hier wohl ausreichen:

PHP:
trim(ucfirst(preg_replace('/[^A-Za-zÄ-Üä-ü ]/', '', $name)));

Sollte es nicht funktionieren, wäre es hilfreich, wenn du ein paar edge cases als Beispiel postest.
 
Zuletzt bearbeitet:
Raijin schrieb:
Alles in allem sollte das hier wohl ausreichen:

PHP:
trim(ucfirst(preg_replace('/[^A-Za-zÄ-Üä-ü ]/', '', $name)));
Man kann sich die Aufzählung der erlaubten Zeichen auch sparen:
PHP:
trim(ucfirst(preg_replace('/[^\w ]/u', '', $name)));
Die Charakterklasse für Wortzeichen enthält auch die ganzen Umlaute, wenn man mit dem Pattern-Modifier "u" die erweiterte UTF-8-Funktionalität aktiviert.

Man sollte dann noch überlegen, auch Bindestriche und Apostroph noch zu erlauben, denn die sind in Namen nicht selten.
 
  • Gefällt mir
Reaktionen: Pfandfinder und Raijin
Zurück
Oben