Sehr interessant. Um Titel URL-tauglich zu machen, habe ich eine Funktion geschrieben, die mir einen Titel in eine URL umwandelt. Weil ich die Funktion gerne gleich direkt im HTML nutzen wollte, hab ich mir die Funktion dann im Smarty registriert. Das ganze sah so aus:
function cleanName($txt) {
$umlaute = Array("ä", "ö", "ü", "Ä", "Ö", "Ü", "ß");
$umlauts = Array("ae", "oe", "ue", "Ae", "Oe", "Ue", "ss");
//string in kleinbuchstaben umwandeln
$txt = strtolower($txt);
//umlaute umwandeln z.b. ä => ae, ö => oe
$txt = str_replace($umlaute, $umlauts, $txt);
//sonstige sonderzeichen durch underscore ersetzen
$txt = preg_replace( '|[^a-zA-Z0-9]|s', '_', $txt );
//leerzeichen durch underscore ersetzen
$txt = str_replace(" ", "_", $txt);
return $txt;
}
$smarty->register_modifier('productCleanName', 'cleanName');
Das ganze funktionierte grundsätzlich auch gut, nur stellte ich nach einer Weile fest, dass Umlaute nicht wie geplant durch ae, oe, ue ersetzt wurden, sondern als Sonderzeichen gewertet und durch underscore ersetzt wurden. Wenn $var = „Statistik für Anfänger“ dann ergibt
{$var|productCleanName}
komischerweise
statistik_f__r_anf__nger
Ich hab ne ganze Weile gebraucht, um zu begreifen, woran das liegt und eigentlich hab ichs auch nur durch Zufall entdeckt. Ich suchte nach Umlautproblemen in Smarty Funktionen und stieß dabei auf allgemeine Umlautprobleme mit strtolower. Und siehe da, als ich strtolower auskommentierte, funktionierte das Umlaut Ersetzen plötzlich einwandfrei.
Jetzt habe ich meine Funktion etwas umgestellt und plötzlich funktionierts:
function cleanName($txt) {
$umlaute = Array("ä", "ö", "ü", "Ä", "Ö", "Ü", "ß");
$umlauts = Array("ae", "oe", "ue", "Ae", "Oe", "Ue", "ss");
//umlaute umwandeln z.b. ä => ae, ö => oe
$txt = str_replace($umlaute, $umlauts, $txt);
//string in kleinbuchstaben umwandeln
$txt = strtolower($txt);
//sonstige sonderzeichen durch underscore ersetzen
$txt = preg_replace( '|[^a-zA-Z0-9]|s', '_', $txt );
//leerzeichen durch underscore ersetzen
$txt = str_replace(" ", "_", $txt);
return $txt;
}
$smarty->register_modifier('productCleanName', 'cleanName');
Nachtrag:
Inzwischen kenne ich noch eine andere Lösung. Danke an meinen Lieblingsleser für den Hinweis. strtolower ist generell wohl nicht geeignet, mit Umlauten umzugehen. Deshalb sollte man statt strtolower besser folgendes verwenden:
//string in kleinbuchstaben umwandeln
$txt = mb_strtolower($txt, "UTF-8");