apostrophe func. in php?
Torben86
- php
hi leute,
habe vor kurzem eine kleine function in php geschrieben, die mir sagt ob das wort, welches man in die function einfügt, ein apostrophe bzw. ein s als zusätzliches Zeichen bekommt wenn man z.B. schreiben will:
Torbens Zuhause.
Denn der Name der in der DB gespeichert ist, lautet ja nur Torben.
Soviel zum nutzen der Function. Die Function kehrt die Zeichen des Wortes einfach um und vergleicht das erste Zeichen, welches jeweils den Index 0 hat.
Ein Problem war, wie ich das ß behandeln sollte. Intern verwaltet PHP soweit ich gelesen habe das ß als zwei Zeichen deswegen musste ich das erste Zeichen, sowie das zweite Zeichen vergleichen. Allerdings gefällt mir das so nicht. Die Sonderzeichen ŸÃ verändern sich manchmal wenn ich die Datei speziell abspeichere. Alle meine Dateien sind im utf-8 format ohne BOM gesichert. Meine Frage lautet ob jemand weiß wie man das evt. eleganter Lösen kann oder ob es eine solche Funktion bereits irgendwo mal gab.
function apostrophe($name)
{
if(stripos(strrev($name), 's') === 0)
{
return $name.''';
}
elseif(stripos(strrev($name), 's') === 0 && stripos(strrev($name), 's') === 1)
{
return $name.''';
}
elseif(stripos(strrev($name), 'Ÿ') === 0 && stripos(strrev($name), 'Ã') === 1)
{
return $name.''';
}
elseif(stripos(strrev($name), 'x') === 0)
{
return $name.''';
}
elseif(stripos(strrev($name), 'z') === 0)
{
return $name.''';
}
elseif(stripos(strrev($name), 'e') === 0 && stripos(strrev($name), 'c') === 1)
{
return $name.''';
}
else
{
return $name.'s';
}
}
echo $begrüßung;
Soviel zum nutzen der Function. Die Function kehrt die Zeichen des Wortes einfach um und vergleicht das erste Zeichen, welches jeweils den Index 0 hat.
Keine ganz schlechte Idee, es gibt aber eine bessere Lösung: substr($string, $start) mit einem negativem Wert für $start ausführen und das Ergebnis mit der gewünschten Zeichenkette vergleichen. Das liest sich als Code auch intuitiver als deine Variante, finde ich.
Ein Problem war, wie ich das ß behandeln sollte. Intern verwaltet PHP soweit ich gelesen habe das ß als zwei Zeichen
PHP kann derzeit noch gar nicht richtig mit UTF-8 umgehen. Das wird es erst ab Version 6 können. Da viele Zeichen in UTF-8 mit mehr als einem Byte kodiert werden gibt es nun Schwierigkeiten mit PHP, das derzeit von der Formel "1 Zeichen = 1 Byte" ausgeht.
elseif(stripos(strrev($name), 's') === 0 && stripos(strrev($name), 's') === 1)
Diese Bedingungen wird nie wahr, da bei beiden stripos-Aufrufen das s an Postion 0 gefunden wird.
return $name.''';
Ich halte es für keine gute Idee, dass diese Funktion bereits ein HTML-spezifisches Ergebnis zurückliefert, denn damit ist sie nicht mehr universell verwendbar. Gib ein echtes ' zurück und behandle es erst dann kontextspezifisch, wenn String in den neuen Kontext übergeben wird.
Um das Problem mit der unterschiedlichen Byte-Länge der Zeichen zu beseitigen, kannst du die Länge des Zeichens zur Laufzeit ermitteln (strlen('ß')) und diesen Wert dem substr() übergeben. Das setzt voraus, dass dein PHP-Quelltext ebenfalls UTF-8-kodiert ist. So bleibt die Funktion auch PHP-6-kompatibel. Unter PHP 5 und 4 ist die Länge 2, unter PHP 6 ist sie 1, substr() schnippelt korrekt und der Vergleich wird auch passen.
Eine ganz schlechte Idee wäre utf8decode() zu verwenden, denn dabei geht dir der Vorteil von UTF-8 verloren.
echo "$verabschiedung $name";
elseif(stripos(strrev($name), 's') === 0 && stripos(strrev($name), 's') === 1)
Diese Bedingungen wird nie wahr, da bei beiden stripos-Aufrufen das s an Postion 0 gefunden wird.
Wieso sollte die Funktion nicht wahr werden? Es ist für Wörter gedacht die auf "ss" enden. Ich bin mir sicher, dass es wahr werden kann sollte so ein Wort vorkommen. Die Funktion substr ist, na klar, viel viel besser. Danke für den Tipp.
Im Moment sieht die funktion also so aus:
function apostrophe($name)
{
if(substr($name, -1) == 's')
{
return $name.''';
}
elseif(substr($name, -2) == 'ss')
{
return $name.''';
}
elseif(substr($name, -1) == 'ß')
{
return $name.''';
}
elseif(substr($name, -1) == 'x')
{
return $name.''';
}
elseif(substr($name, -1) == 'z')
{
return $name.''';
}
elseif(substr($name, -2) == 'ce')
{
return $name.''';
}
else
{
return $name.'s';
}
}
Das die Funktion den Namen wiedergibt, ist so gewollt, da sie Teil einer anderen Funktion ist die sich nur mit den Namen auseinandersetzt. Sie hat halt nur die eine Aufgabe.
Was den Tipp bezüglich des ß angeht muss ich noch einmal nachfragen. Wie genau hast du das gemeint?
echo $begrüßung;
elseif(stripos(strrev($name), 's') === 0 && stripos(strrev($name), 's') === 1)
Diese Bedingungen wird nie wahr, da bei beiden stripos-Aufrufen das s an Postion 0 gefunden wird.
Wieso sollte die Funktion nicht wahr werden? Es ist für Wörter gedacht die auf "ss" enden.
stripos() findet das erste Vorkommen eines Zeichens. Und das ist bei einem mit s beginnenden String immer das Zeichen an Position 0, auch bei mehrfachen Aufrufen.
Der Teil stripos(strrev($name), 's') === 1 wird nicht wahr, weil das Ergebnis von stripos(...) === 0 ist.
return $name.''';
Das die Funktion den Namen wiedergibt, ist so gewollt, da sie Teil einer anderen Funktion ist die sich nur mit den Namen auseinandersetzt. Sie hat halt nur die eine Aufgabe.
Bei dir hat sie aber noch die zweite Aufgabe bekommen, Apostrophe als HTML-Entity zurückzuliefern. Und das ist normalerweise nicht die Aufgabe einer Daten verarbeitenden Funktion sondern von Funktionen, die sich um die Ausgabe kümmeren sollen.
Was den Tipp bezüglich des ß angeht muss ich noch einmal nachfragen. Wie genau hast du das gemeint?
Alle PHP-String-Funktionen arbeiten derzeit nach dem "1 Zeichen = 1 Byte"-Prinzip. Wenn du also von einem Wort mit ß am Ende selbiges haben willst, musst du entweder wissen, wieviel Bytes es lang ist, oder diese Angabe ermitteln lassen.
$len = strlen('ß') liefert bei einem UTF-8-kodierten ß [1] als Ergebnis den Wert 2. Du kannst nun $len als Parameter an substr() übergeben. Ab PHP 6 und aktivierter Multibyte-Unterstützung liefert strlen('ß') hingegen den Wert 1. Du musst als bei Verwendung von $len dein Script nicht ändern. Bei einer fest kodierten 2 müsstest du diese dann auf 1 ändern.
PHP kann auch jetzt schon einigermaßen mit Mehrbyte-Kodierungen umgehen, wenn die Multibyte String Functions verwendet werden, was aber bei den Providern nicht unbedingt[2] installiert ist.
[1] sprich: der Script-Quelltext muss UTF-8-kodiert vorliegen.
[2] ich schätze sogar eher auf selten bis gar nicht
echo "$verabschiedung $name";
Hallo
Wieso sollte die Funktion nicht wahr werden? Es ist für Wörter gedacht die auf "ss" enden. Ich bin mir sicher, dass es wahr werden kann sollte so ein Wort vorkommen.
Wir nehmen an, $name sei "Abriss" (Mir fällt partout kein Name ein, der auf "ss" endet.)
function apostrophe($name)
{
if(substr($name, -1) == 's')
{
return $name.''';
}
substr($name, -1) == 's'
ist wahr, da das letzte Zeichen ein "s" ist.
elseif(substr($name, -2) == 'ss')
{
return $name.''';
}
Dieser Zweig wird _nie_ funktionieren, da bereits die erste Bedingung zutraf[1] und zudem die Funktion mit dem return des erweiterten Werts von $name beendet wurde. Frage in diesem Fall zuerst nach "ss" und erst danach nach "s".
[1] Die zweite Bedingung würde wegen des else if
nur ausgewertet, wenn die erste Bedingung _nicht_ zutraf.
Tschö, Auge