[PHP] Zeichenketten normalisieren – Groß- und Kleinschreibung

Dieser Beitrag ist auch verfügbar in: Englisch

Hallo,

heute mal wieder eine kleine Aufgabe in PHP. Folgende Situation:

Wir haben einen Text-String in dem (natürlich) ein Text steht. Nehmen wir an der Inhalt lautet
HIER bekommen Sie heute total GÜNSTIGE Gurken DIREKT vom Landwirt.
Wir möchten diesen String jetzt automatisch so umändern das alle Wörter die nur Großbuchstaben enthalten, umgewandelt wird in: Anfangsbuchstabe groß – Rest klein
Also so wie sich das gehört. Natürlich müssten wir jetzt logischerweise gucken welche davon wirklich mit einem Großbuchstaben anfangen, wenn Sie denn mitten im Satz stehen. Denn sonst würden wir eine furchtbare Rechtschreibung dabei entstehen lassen. Aber wenn man nicht gerade ein verdammt gutes Wörterbuch (Datenbank) und eine entsprechend gute Routine parat hat, dann muss man sich erst einmal mit meiner Lösung zufrieden geben.

Also Aufgabenstellung ist klar. Wörter die nur aus Großbuchstaben bestehen sollen in kleine Buchstaben mit dem ersten Zeichen groß umgewandelt werden. Aus dem Beispiel oben wird dann aus HIER -> Hier

Eine fertige Lösung gibt es nicht. Etwas eigenes muss her. Der naheliegendste Gedanke ist die Wörter aufteilen und jedes einzelne Kontrollieren ob es nur aus Großbuchstaben besteht. Wenn ja, dann umwandeln, wenn nicht…. dann nicht. Danach alles wieder zusammenbasteln und fertig.

Soweit, so gut. Funktioniert auch sehr schön. Nur eine Sache ist mir aufgefallen. Ich habe zum Umwandeln erst die Funktion ucfirst() benutzt. Diese macht genau das. Erster Buchstabe groß. Man muss nur vorher alles erst einmal mit strtolower() alles klein machen.
Und hier gab es das Problem. Durch Zufall habe ich “GRÖßE” umwandeln wollen. Dabei hat es die Umlaute total zerschossen. Wenn strtolower() Umlaute “klein macht” dann zerschießt es irgendwie den Charset. Genauer habe ich mich damit noch nicht beschäftigt, aber zumindest eine Lösung gefunden. Und die heißt: mb_strtolower($String,’UTF-8′)

Wie man sieht kann man hier den Charset mit angeben.  Somit bleiben Umlaute erhalten.

Hier noch mal der ganze Code.

function NormalizeString($String) {
		$StrA = explode(" ", $String);
		$StrAc = count($StrA);
		$Out = "";
		for($i=0;$i<$StrAc;$i++) {
			$tmp = preg_replace('/[^a-zA-ZäÄöÖüÜß]/', '', $StrA[$i]);
			if(!empty($tmp) && strtoupper($tmp) == $tmp) {
				//Alles groß
				$StrA[$i] = ucfirst(mb_strtolower($StrA[$i],'UTF-8'));
			}
			$Out .= $StrA[$i]." ";
		}
		
		return $Out;
	}

Erst erstellen wir mit explode() ein Array der einzelnen Wörter. Dann durchlaufen wir jedes einzelne in einer For-Schleife. Wir erstellen eine TMP-Variable in der das Wort noch einmal bereinigt wird, damit man es besser vergleichen kann. Was dann auch getan wird. Wird festgestellt das dass Wort groß geschrieben ist, so ändern wir das. Und dann geht alles wieder in die $Out Variable zurück und wird schließlich zurück gegeben.

Viele Grüße
Gordon

0 Kommentare

Hinterlasse einen Kommentar

An der Diskussion beteiligen?
Hinterlasse uns deinen Kommentar!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Ich stimme der Datenschutzerklärung zu