ersten Buchstaben groß schreiben (auch äöü)
Andreas
- php
Hallo!
Es gibt ja in php ne prima Funktion, wie man jeweils den ersten Buchstaben jedes Wortes eines Strings groß schreiben kann - ucwords(). Diese Funktion hat aber folgende Nachteile:
Bei mir geht es darum usereingaben automatisch in ein "vernünftiges" Format zu ändern. Bei obiger Funktion habe ich im Manual schon einige Workarounds gefunden, aber leider immer ohne Beachtung der Umlaute. Am besten fand ich folgende Funktion(ich will nichts in der ini verändern, oder geht das temmporär für ein Script?):
function uc_all($string) {
$temp = preg_split('/(\W)/', $string, -1, PREG_SPLIT_DELIM_CAPTURE );
foreach ($temp as $key=>$word) {
$temp[$key] = ucfirst(strtolower($word));
}
return join ('', $temp);
}
ich habe es auch geschafft das der reguläre Ausdruck auf äöü reagiert, also: /([^\wäÄöÖüÜ])/
Aber das Problem ist, das PHP nicht weiß wie man äöü groß schreibt. Jemand ne Idee wie man das vernünftig macht?
Die zu überprüfenden Eingaben sind Name und Adresse. Außer -.äöü, sieht jemand noch weitere Probleme für diesen Anwendungsbereich?
Viele Grüße
Andreas
Hallo Andreas,
Es dürfte ziemlich genau drei Umlaute geben, die groß zu schreiben wären, oder? Was spricht dann dagegen per substring den ersten Buchstaben anzuschauen und per eigener Funktion auszutauchen. In der Art:
$wort = umlaute(substr($wort,0,1));
function umlaute($text){
$sonderzeichen = array ("ä" => "Ä",
"ö" => "ö",
"ü" => "Ü");
$value = strtr($value, $sonderzeichen);
return $value;
}
Grüße aus Würzburg
Julian
Hallo!
Es dürfte ziemlich genau drei Umlaute geben, die groß zu schreiben wären, oder? Was spricht dann dagegen per substring den ersten Buchstaben anzuschauen und per eigener Funktion auszutauchen. In der Art:
Ja, daran hatte ich auch gedacht, fand das nur irgendwie "gefrickelt".
$wort = umlaute(substr($wort,0,1));
function umlaute($text){
$sonderzeichen = array ("ä" => "Ä",
"ö" => "ö",
"ü" => "Ü");
$value = strtr($value, $sonderzeichen);
return $value;
}
Nur geht es nicht um html-zeichen, sondern um Datenbankeinträge, jdn da hätte ich lieber die Echten Zeichen ;-)
Aber das Prinzip ist ja das gleiche. Aber danke für Deinen Vorschlag, denn meine Version war mit 3 ifs... und deutlich unschöner ;-)
Habe durch Zufall die Funktion setlocale() gefunden, die einfach auf den deutschen Zeichensatz umschaltet:
<?php
setlocale(LC_CTYPE, "de_DE");
function uc_all($string) {
$temp = preg_split('/(\W|_)/', trim($string), -1, PREG_SPLIT_DELIM_CAPTURE );
foreach ($temp as $key=>$word) {
$temp[$key] = ucfirst(strtolower($word));
}
return join ('', $temp);
}
$text = "markus.ößt&Ein_kleines-schaf.";
echo uc_all($text); // ergibt "Markus.Ößt&Ein_Kleines-Schaf."
?>
Also im prinzip alles OK, oder? Wie gesagt geht es um Namen und Adressen, habt Ihr noch Ideen was da noch für Eingaben möglich sind, an die ich nicht gedacht habe?
Viele Grüße
Andreas
Hallo,
setlocale(LC_CTYPE, "de_DE");
Achja, stimmt, da war mal was. Hatte damit aber auch schon genug Probleme (war aber bei Datumsformaten).
habt Ihr noch Ideen was da noch für Eingaben möglich sind, an die ich nicht gedacht habe?
Hm, was ist mit einem großen scharfen "s" am Anfang eines Wortes? Also z.B. "Würzburger ßtrasse"? ;-)
Grüße aus Würzburg
Julian
Hi!
setlocale(LC_CTYPE, "de_DE");
Achja, stimmt, da war mal was. Hatte damit aber auch schon genug Probleme (war aber bei Datumsformaten).
Ist wirklich praktisch! Funktioniert das denn in jeder neueren PHP-Version?
habt Ihr noch Ideen was da noch für Eingaben möglich sind, an die ich nicht gedacht habe?
Hm, was ist mit einem großen scharfen "s" am Anfang eines Wortes? Also z.B. "Würzburger ßtrasse"? ;-)
Ja, das bleibt wie es ist. Nur - sag mir _ein_ Wort/Name/Adresse das mit ß anfängt!
Sonst müßte ich das wie von Dir beschrieben machen, nur wenn die Wahrscheinlichkeit so weit gegen 0 tendiert, sollte ich es besser lassen, oder?
Kennst Du vielleicht noch ne einfache Möglichkeit, überflüssige Leerzeichen zwischen den Worten zu entfernen?
Grüße
Andreas
Hi!
Kennst Du vielleicht noch ne einfache Möglichkeit, überflüssige Leerzeichen zwischen den Worten zu entfernen?
Wie wäre es mit:
$str = ereg_replace(" +"," ",$str); # Reduziert alle Leerzeichen auf eines
MfG, Arne P.
Hallo!
$str = ereg_replace(" +"," ",$str); # Reduziert alle Leerzeichen auf eines
stimmt ;-) Am besten am Anfang der Dunktion einmal drüberlaufen lassen!
wobei man glaube ich aus Performance-Gründen lieber
$str = preg_replace("/ +/"," ",$str);
verwenden sollte, oder?
Grüße
Andreas
Hallo nochmal!
Welchen Ausdruck würdet ihr verwenden:
$str = str_replace(" "," ",$str);
$str = preg_replace("/ +/"," ",$str);
$str = ereg_replace(" +"," ",$str);
Vermutlich ist das die Reigenfolge nach Geschwindigkeit geordnet, oder?
Sollte man nicht wo geht immer str_replace() verwenden, und sonst preg_replace(), und nie ereg_replace()?
Grüße
Andreas
Hi.
$str = str_replace(" "," ",$str);
Das geht gar nicht, da der gesamte String nur einmal durchsucht wird. Es müßten also mehrere Aufrufe erfolgen!
str_replace durchsucht den String einmal von vorne nach hinten und sucht somit an jeder Stelle genau einmal. Die beiden anderen suchen aber ein oder mehr Leerzeichen und ersetzen sie druch ein einzelnes Leerzeichen.
$str = preg_replace("/ +/"," ",$str);
$str = ereg_replace(" +"," ",$str);
Vermutlich ist das die Reigenfolge nach Geschwindigkeit geordnet, oder?
Keine Ahnung, welches schneller ist, müßte man mal ausprobieren...
Sollte man nicht wo geht immer str_replace() verwenden
Für einzelne Zeichen schon. Aber wenn man "mehr" ersetzen will (wie im Beispiel), braucht man eben reguläre Ausdrücke.
und sonst preg_replace(), und nie ereg_replace()?
preg_replace ist Perl-kompatibel, hat im Zweifelsfalle mehr Funktionen als ereg_replace (denke ich doch, Perls Regex ist ja ziemlich mächtig). Mit preg_replace kann man z.B. Arrays als Argumente nehmen, bei ereg_replace nicht.
Siehe auch <img src="http://selfaktuell.teamone.de/src/de.gif" border=0 alt=""> http://www.php.net/manual/de/function.ereg-replace.php und <img src="http://selfaktuell.teamone.de/src/en.gif" border=0 alt=""> http://www.php.net/manual/de/function.preg-replace.php
Hallo!
$str = str_replace(" "," ",$str);
Das geht gar nicht, da der gesamte String nur einmal durchsucht wird. Es müßten also mehrere Aufrufe erfolgen!
str_replace durchsucht den String einmal von vorne nach hinten und sucht somit an jeder Stelle genau einmal. Die beiden anderen suchen aber ein oder mehr Leerzeichen und ersetzen sie druch ein einzelnes Leerzeichen.
Zitat von http://www.php.net/manual/de/function.str-replace.php:
string str_replace ( string needle, string str, string haystack)
Diese Funktion ersetzt alle Vorkommen von needle innerhalb der Zeichenkette haystack durch den String str.
$str = preg_replace("/ +/"," ",$str);
$str = ereg_replace(" +"," ",$str);
Vermutlich ist das die Reigenfolge nach Geschwindigkeit geordnet, oder?
Keine Ahnung, welches schneller ist, müßte man mal ausprobieren...
Zitat von http://www.php.net/manual/de/function.ereg-replace.php:
string ereg_replace ( string Suchmuster, string Ersatz, string Zeichenkette)
Anmerkung: Die Funktion preg_replace(), die eine zu Perl kompatible Syntax regulärer Ausdrücke verwendet, ist häufig die schnellere Alternative zu ereg_replace().
Sollte man nicht wo geht immer str_replace() verwenden
Für einzelne Zeichen schon. Aber wenn man "mehr" ersetzen will (wie im Beispiel), braucht man eben reguläre Ausdrücke.
s.o.
und sonst preg_replace(), und nie ereg_replace()?
preg_replace ist Perl-kompatibel, hat im Zweifelsfalle mehr Funktionen als ereg_replace (denke ich doch, Perls Regex ist ja ziemlich mächtig). Mit preg_replace kann man z.B. Arrays als Argumente nehmen, bei ereg_replace nicht.
klar, ist aber gleichzeitig schneller!
Dazu: http://www.dclp-faq.de/q-regexp-ereg.html
Siehe auch <img src="http://selfaktuell.teamone.de/src/de.gif" border=0 alt=""> http://www.php.net/manual/de/function.ereg-replace.php und <img src="http://selfaktuell.teamone.de/src/en.gif" border=0 alt=""> http://www.php.net/manual/de/function.preg-replace.php
Danke ;-)
Grüße
Andreas
Hi.
Zitat von http://www.php.net/manual/de/function.str-replace.php:
string str_replace ( string needle, string str, string haystack)
Diese Funktion ersetzt alle Vorkommen von needle innerhalb der Zeichenkette haystack durch den String str.
Das stimmt, aber nach folgendem Schema:
Gegebener String:
$str = "#..........#"; //10 Punkte
(wir können ja Punkte statt Leerzeichen verwenden, ist übersichtlicher)
Nach einem Durchlauf
$str = str_replace("..",".",$str); // geht bei den Regex-Ersetzungen natürlich nicht ;-)
erhalten wir:
"#.....#"; //5 Punkte
Dies kommt daher, daß str_replace() den String von vorne (oder hinten?) durchsucht und dabei jedes Vorkommen von 2 Punkten durch 1 Punkt durchsucht. Am Ende angekommen wird der String nicht noch einmal nach weiteren Vorkommen durchsucht.
Es werden dabei 5x 2 Punkte gefunden, die dann ersetzt werden, also bleiben 5 Punkte am Ende übrig.
Wenn Du mir nicht glaubst, probier es aus! ;-)
Anmerkung: Die Funktion preg_replace(), die eine zu Perl kompatible Syntax regulärer Ausdrücke verwendet, ist häufig die schnellere Alternative zu ereg_replace().
Wer lesen kann ist klar im Vorteil ;-)
Bei meiner Offline-Doku steht der zweite Halbsatz nicht drinnen... vielleicht sollte ich mir mal eine neue Version runterladen... Danke! :-)
MfG, Arne P.
Hi!
Diese Funktion ersetzt alle Vorkommen von needle innerhalb der Zeichenkette haystack durch den String str.
Das stimmt, aber nach folgendem Schema:
Gegebener String:
$str = "#..........#"; //10 Punkte
(wir können ja Punkte statt Leerzeichen verwenden, ist übersichtlicher)
Nach einem Durchlauf
$str = str_replace("..",".",$str); // geht bei den Regex-Ersetzungen natürlich nicht ;-)
erhalten wir:
"#.....#"; //5 Punkte
Dies kommt daher, daß str_replace() den String von vorne (oder hinten?) durchsucht und dabei jedes Vorkommen von 2 Punkten durch 1 Punkt durchsucht. Am Ende angekommen wird der String nicht noch einmal nach weiteren Vorkommen durchsucht.
Es werden dabei 5x 2 Punkte gefunden, die dann ersetzt werden, also bleiben 5 Punkte am Ende übrig.
Wenn Du mir nicht glaubst, probier es aus! ;-)
OK:
<?php
$laenge_vor=1;
$laenge_nach=0;
$string = "quatsch....quatschquatsch.............quatschquatschquatsch";
while($laenge_vor > $laenge_nach) {
$laenge_vor = strlen ($string);
$string = str_replace ("..",".",$string);
$laenge_nach = strlen ($string);
}
?>
so in etwa sollte es gehen, komme aber für keine Schäden auf ;-)
?>
Anmerkung: Die Funktion preg_replace(), die eine zu Perl kompatible Syntax regulärer Ausdrücke verwendet, ist häufig die schnellere Alternative zu ereg_replace().
Wer lesen kann ist klar im Vorteil ;-)
sehe ich genau so, hätte oben mal besser lesen sollen ;-)
Bei meiner Offline-Doku steht der zweite Halbsatz nicht drinnen... vielleicht sollte ich mir mal eine neue Version runterladen... Danke! :-)
Wozu gibt es Flatrates....
Grüße
Andreas