Testen ob erster Buchstabe gross ist
Ingo W.
- php
nAbend zusammen,
wie krieg ich mit PHP raus, ob der erste Buchstabe in einem String gross oder klein ist??
Danke für die Antworten,
Ingo
Holladiewaldfee,
$bla = preg_match("/[1]/", $der_string);
Jetzt habe ich aber obern Gelesen, das Ä, Ö, Ü (u.a.) nicht berücksichtig werden. Kann man das noch irgendwie in Deinen Funktion einbauen?
$bla = preg_match("/^([A-Z]|Ä|Ö|Ü)/", $der_string);
Ciao,
Harry
A-Z ↩︎
Moin!
$bla = preg_match("/[1]/", $der_string);
Jetzt habe ich aber obern Gelesen, das Ä, Ö, Ü (u.a.) nicht berücksichtig werden. Kann man das noch irgendwie in Deinen Funktion einbauen?
$bla = preg_match("/^([A-Z]|Ä|Ö|Ü)/", $der_string);
Warum so kompliziert? Du benutzt bereits eine Zeichenklasse [A-Z]. Der kann man doch einfach alle weiteren, zu erkennenden Großbuchstaben, die man haben will, hinzufügen:
$bla = preg_match("/[2]/",$der_string);
:)
- Sven Rautenberg
Holladiewaldfee,
Warum so kompliziert? Du benutzt bereits eine Zeichenklasse [A-Z]. Der kann man doch einfach alle weiteren, zu erkennenden Großbuchstaben, die man haben will, hinzufügen:
$bla = preg_match("/[1]/",$der_string);
:)
Es ist generell eine schlechte Idee, ca. 5 Minuten nach dem Frühstück reguläre Ausrücke bauen zu wollen ... ;-)
Ciao,
Harry
A-ZÄÖÜ ↩︎
Guten [Tageszeit],
Senf,
$bla = preg_match("/[1]/",$der_string);
na und so weiter...
Es ist generell eine schlechte Idee, ca. 5 Minuten nach dem Frühstück reguläre Ausrücke bauen zu wollen ... ;-)
Wieso, hast Du schon gefrühstückt?
Liebe Grüße aus http://www.braunschweig.de
Tom
A-ZÄÖÜÁÀÉÈ ↩︎
Hallo Ingo,
wie krieg ich mit PHP raus, ob der erste Buchstabe in einem String gross oder klein ist??
if($text==ucfirst($text)) echo "erster buchstabe ist groß";
oder
if($text[0]==strtoupper($text[0])){ echo "erster buchstabe ist groß";
ungetestet :-) - wobei Harrys Vorschlag vermtutlich besser ist...
Grüße aus Nürnberg
Tobias
Moin!
if($text==ucfirst($text)) echo "erster buchstabe ist groß";
oder
if($text[0]==strtoupper($text[0])){ echo "erster buchstabe ist groß";ungetestet :-) - wobei Harrys Vorschlag vermtutlich besser ist...
Das würde ich nicht sagen. Harry schmeißt gleich die komplette reguläre Ausdrucksmaschine an. Die ist zwar sehr mächtig, kostet aber auch performance. Dein Vorschlag hingegen operiert praktisch nur mit einem Byte. Welche Zeichen eine Entsprechung als großer Buchstabe haben, kann man in Tabellen ablegen, vielleicht auch als Bit-Operation herstellen - das ist sehr schnell realisiert.
Ich würde schätzen, das Rennen um eine Millionen Strings mit oder ohne großen ersten Buchstaben würdest du gewinnen, nicht Harry.
- Sven Rautenberg
Hi Sven,
Das würde ich nicht sagen. Harry schmeißt gleich die komplette reguläre Ausdrucksmaschine an. Die ist zwar sehr mächtig, kostet aber auch performance.
Hast du Benchmarks gemacht?
Wie groß ist der Unterschied denn?
Spielt das im vorgesehenen Anwendungsfall eine Rolle?
Wieso wird bei offensichtlichen Anfängerfragen immer wieder auf die vermeintliche Performanceunterschiede hingewiesen zu deren korrekter Bewertung ein vielfaches an Wissen nötig ist als der Fragesteller hat?
Dein Vorschlag hingegen operiert praktisch nur mit einem Byte. Welche Zeichen eine Entsprechung als großer Buchstabe haben, kann man in Tabellen ablegen, vielleicht auch als Bit-Operation herstellen - das ist sehr schnell realisiert.
Die Bit-Operationen versagen bei den diakritischen Zeichen - strtoupper bei korrekter Spracheinstellung und Installation nicht.
Eine Tabelle muss der Interpreter über einen Hash adressieren, ebenso zweimal das erste Zeichen des Strings.
Ich würde schätzen, das Rennen um eine Millionen Strings mit oder ohne großen ersten Buchstaben würdest du gewinnen, nicht Harry.
Du weisst das die regulären Ausdrücke kompiliert und gecachet werden?
Wenn also der reguläre Ausdruck in einem effizienten Sprachkonstrukt angewandt wird, kann er durchaus das Rennen machen.
Meine Versuche mit gut 1000 Strings (=Zeilen des Forums) ergaben z.B. keine signifikanten Unterschiede in der Laufzeit zwischen einer str_replace() und preg_replace() Lösung.
Eine sinnvolle Laufzeitoptimierung sollte also -nachdem(!) die Notwendigkeit einer solchen festgestellt wurde- beide Varianten gegeneinander benchmarken.
Meist wird man hinterher feststellen das soetwas 3% bringt, nachdem die Optimierung des Algorithmus 50% gebracht hat.
Gruss,
Carsten
Moin!
Das würde ich nicht sagen. Harry schmeißt gleich die komplette reguläre Ausdrucksmaschine an. Die ist zwar sehr mächtig, kostet aber auch performance.
Hast du Benchmarks gemacht?
Noch nicht.
Wie groß ist der Unterschied denn?
Ich habe keine Ahnung - ich werde es morgen herausfinden... ähm, heute - später aber.
Spielt das im vorgesehenen Anwendungsfall eine Rolle?
Wahrscheinlich nicht. Ich wollte primär darauf hinweisen, dass eine RegEx-Lösung nicht unbedingt die beste ist, wie von Tobias behauptet.
Wieso wird bei offensichtlichen Anfängerfragen immer wieder auf die vermeintliche Performanceunterschiede hingewiesen zu deren korrekter Bewertung ein vielfaches an Wissen nötig ist als der Fragesteller hat?
Es ging mir nur darum, auf die Antworten zu antworten, insbesondere herauszustreichen, dass nicht eine Lösung gut und die andere schlecht ist.
Dein Vorschlag hingegen operiert praktisch nur mit einem Byte. Welche Zeichen eine Entsprechung als großer Buchstabe haben, kann man in Tabellen ablegen, vielleicht auch als Bit-Operation herstellen - das ist sehr schnell realisiert.
Die Bit-Operationen versagen bei den diakritischen Zeichen - strtoupper bei korrekter Spracheinstellung und Installation nicht.
Eine Tabelle muss der Interpreter über einen Hash adressieren, ebenso zweimal das erste Zeichen des Strings.
Ich meinte (ohne es klar zu sagen), dass die angesprochenen Möglichkeiten in der verwendeten Sprache bereits implementiert sind, man also nur noch die passende Funktion benutzen muss - und dies als Begründung, warum ein RegEx langsam sein kann, eine alternative Methode schnell.
Ich würde schätzen, das Rennen um eine Millionen Strings mit oder ohne großen ersten Buchstaben würdest du gewinnen, nicht Harry.
Du weisst das die regulären Ausdrücke kompiliert und gecachet werden?
Wenn also der reguläre Ausdruck in einem effizienten Sprachkonstrukt angewandt wird, kann er durchaus das Rennen machen.
Ok, das Problem ist dann "nur noch", dass alle großen Buchstaben in den RegEx hinein müssen. Und da ist es mit "A-Z" nicht getan. Allein die deutsche Sprache kennt auch noch Ä, Ö und Ü, die beachtet werden müssen, ganz zu schweigen von all den Zeichen, die Unicode bietet, und bei denen es sicherlich viele gibt, die als "Großbuchstabe" zu bezeichnen sind.
Ganz krass im Gegensatz dazu: Es gibt Zeichen, die gibts nur als Kleinbuchstaben. "ß" gehört dazu. Also ist die Methode, einfach den ersten Buchstaben in einen Großbuchstaben zu verwandeln und nachzugucken, ob das Ergebnis mit dem unbehandelten Buchstaben übereinstimmt, auch nicht fehlerfrei. Allerdings ist beispielsweise das ß eher selten am Wortanfang zu finden, die Fehler treten also nur selten auf.
- Sven Rautenberg
Holladiewaldfee,
Ok, das Problem ist dann "nur noch", dass alle großen Buchstaben in den RegEx hinein müssen. Und da ist es mit "A-Z" nicht getan. Allein die deutsche Sprache kennt auch noch Ä, Ö und Ü, die beachtet werden müssen, ganz zu schweigen von all den Zeichen, die Unicode bietet, und bei denen es sicherlich viele gibt, die als "Großbuchstabe" zu bezeichnen sind.
Ganz krass im Gegensatz dazu: Es gibt Zeichen, die gibts nur als Kleinbuchstaben. "ß" gehört dazu. Also ist die Methode, einfach den ersten Buchstaben in einen Großbuchstaben zu verwandeln und nachzugucken, ob das Ergebnis mit dem unbehandelten Buchstaben übereinstimmt, auch nicht fehlerfrei. Allerdings ist beispielsweise das ß eher selten am Wortanfang zu finden, die Fehler treten also nur selten auf.
Können wir bei Otto-Normal-Programmierer nicht einfach davon ausgehen, daß er ein deutsches oder ein englisches Wort meint? Müssen wir immer gleich aus Mücken Elefanten machen?
Ciao,
Harry
Hallo!
wie krieg ich mit PHP raus, ob der erste Buchstabe in einem String gross oder klein ist??
if($text==ucfirst($text)) echo "erster buchstabe ist groß";
oder
if($text[0]==strtoupper($text[0])){ echo "erster buchstabe ist groß";ungetestet :-)
Beispiel aus dem PHP-Manual:
// Das erste Zeichen eines Strings.
$str = 'Das ist ein Test.'
$first = $str{0}; // $first enthält "D"
Wobei das normalerweis enicht mit unseren deutschen Umlauten funktionieren sollte(glaube ich zumindest), daher könnte man die Lokal-EInstelklungen ändern: http://de3.php.net/manual/de/function.setlocale.php, oder mit extra if's(nicht so schön ;-)).
- wobei Harrys Vorschlag vermtutlich besser ist...
Von wegen Perfmance, das kommt immer auf die Größe des Textes und die Anzahl der Treffer an. Ich habe das mal getestet, mit langen Texten, und habe folgende Reihenfolge bekommen:
1. String-Funktionen
2. preg_ Funktionen
3. ereg_ Funktionen
letztere kannst Du total vergessen, würde ich niemals benutrzen, sind erheblich langsamer und dabei noch weniger mächtig.
Für einfache Sachen solte man String-Funktionen verwenden, solange man damit auskommt, und sonst halt preg_
Genaue Zahlen hatte ich sogar mal hier im Forum gepostet:
</archiv/2002/10/25862/#m141572>
war aber ein ganz spezieller Test und vielleicht nicht so zu verallgemeinern.
Grüße
Andreas