Erster Buchstaben jedes Wortes groß – ucwords #2

Vor knapp einen Monat hatte ich zum ersten mal über die Funktion ucwords() berichtet. Das ganze war auch ganz gut angekommen, aber leider geht es nicht überall 🙂 . Ein Leser hat mir geschrieben, das er mit der Funktion leider nicht den gewünschten Effekt bei Strassennamen erhält wo ein „-" enthalten ist.

Sprich er macht aus „Siegmund-Freud-Straße" einfach „Siegmund-freud-straße". Das ist aus der Sicht der Funktion absolut richtig, aber nicht aus der des Anwenders. Nach kurzen überlegen waren mir dann schon viele explode und foreach Varianten eingefallen und noch die Anzahl an „-" Zeichen zählen. Naja das ganze erschien mir dann viel zu kompliziert und ich dachte mir, das es doch etwas anderes geben muss. Danach war die Idee da, die Leerzeichen durch andere Zeichen zu ersetzten und so dann alles mehrfach durch zuarbeiten. Hier mal ein Beispiel:
<code>$String="tEst test TEST-tESt";<br>
<br>
$Schritt_1=str_replace(" ", "$%&%$",$String);<br>
$Schritt_2=strtolower($Schritt_1);<br>
$Schritt_3=str_replace("-", " ",$Schritt_2);<br>
$Schritt_4=ucwords($Schritt_3);<br>
$Schritt_5=str_replace(" ", "-",$Schritt_4);<br>
$Schritt_6=str_replace("$%&%$", " ",$Schritt_5);<br>
$Schritt_7=ucwords($Schritt_6);<br>
<br>
echo"Input: $String<br>
Output: $Schritt_7Schritte:<br>
1: $Schritt_1<br>
2: $Schritt_2<br>
3: $Schritt_3<br>
4: $Schritt_4<br>
5: $Schritt_5<br>
6: $Schritt_6<br>
7: $Schritt_7";</code>


Ausgabe daraus wäre dann:
<code>Input: tEst test TEST-tESt<br>
Output: Test Test Test-Test<br>
<br>
Schritte:<br>
1: tEst$%&%$test$%&%$TEST-tESt<br>
2: test$%&%$test$%&%$test-test<br>
3: test$%&%$test$%&%$test test<br>
4: Test$%&%$test$%&%$test Test<br>
5: Test$%&%$test$%&%$test-Test<br>
6: Test test test-Test<br>
7: Test Test Test-Test</code>


Das ganze sieht soweit okay aus. Da gibt es nichts zu meckern. Es ist halt nur einfach sehr sehr lang 🙁 . Das macht es für mich etwas unattraktiv.

Darum nochmal neu überdacht und gegooglet und siehe da. Eine Lösung fand sich bei selfhtml.org. Der Vorschlag vom markus war relativ einfach, aber gut:
<code>$neuerString = str_replace(" |] - [| ", "-",ucwords(strtolower(str_replace("-", " |] - [| ",$String))));</code>


Ich habe das ganze dann noch in seine Bestandteile aufgeteilt und etwas optimiert, damit es leichter zu erweitern ist. Es bietet zwar alles was ich jetzt brauche, aber wenn ich mal Probleme mit anderen Zeichen habe, will ich mich nicht erneut an die Funktion setzten. Darum hier mal mein Vorschlag:
<code>$String="tEst.teSt test TEST-tESt.TEsT";<br>
<br>
$Zu_Ersetzten=array("-" => " |] - [| ","." => " |] . [| ");<br>
$Zu_Zurueck_Ersetzten=array_flip($Zu_Ersetzten);<br>
<br>
$Schritt_1=strtr($String,$Zu_Ersetzten);<br>
$Schritt_2=strtolower($Schritt_1);<br>
$Schritt_3=ucwords($Schritt_2);<br>
$Schritt_4=strtr($Schritt_3,$Zu_Zurueck_Ersetzten);<br>
<br>
echo"Input: $String<br>
Output: $Schritt_4<br>Schritte:<br>
1: $Schritt_1<br>
2: $Schritt_2<br>
3: $Schritt_3<br>
4: $Schritt_4";</code>

Das wäre dann die Ausgabe:
<code>Input: tEst.teSt test TEST-tESt.TEsT<br>
Output: Test.Test Test Test-Test.Test<br>
<br>
Schritte:<br>
1: tEst |] . [| teSt test TEST |] - [| tESt |] . [| TEsT<br>
2: test |] . [| test test test |] - [| test |] . [| test<br>
3: Test |] . [| Test Test Test |] - [| Test |] . [| Test<br>
4: Test.Test Test Test-Test.Test<br></code>


Damit will ich einfach gleich die Möglichkeit haben Verschiedene Zeichen berücksichtigen zu können ($Zu_Ersetzten=array(„-" => " |] -- [| „,"." => " |] . [| „);) und das ganze möglichst ohne großen Aufwand. Es ist im Grunde meine Idee von oben, die Leerzeichen zu ersetzten, aber markus ersetzt die -- Zeichen lieber durch etwas, womit dann auch ucwords() arbeiten kann. Dadurch spart man sich den doppelten Furchlauf.

Schreibe einen Kommentar

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