Erstmal: Prosit Neujahr, alle miteinander!
(Wieso kommt mir jetzt der Spruch "Lieber [aA]rm dran, als Arm ab!" in den Sinn ... ;-))
Mhmmm, mal sehen:
Du fragst 4 Bedingungen ab, die du über drei Zeilen verteilst, ich nur eine auf einer Zeile.
Wenn wir mal nur die "Kernabfragen" vergleichen:
strspn($string, "abcdefghijklmnopqrstuvwxyz0123456789_.") == $len;
vs.
preg_match('/\A(?=[^\.]{0,10}(?:\.[^\.]{0,10})?)[a-z0-9_.]{4,10}\z/', $string);
Okay, du hast 13 Tastendrücke gespart. ;-)
Probleme bekämst du nur, wenn sich die Anforderung ändern würde, und bspw. zusätzlich Großbuchstaben erlaubt werden würden.
Nebenbei könnte man den PCRE natürlich auch umbrechen und Newbie-tauglich formatieren. Guckst du hier:
Ja, da scheiden sich die Geister. Es ging mir auch mehr darum, denen, die immer noch das uralte Vorurteil "PCRE sind laaaangsam" vor sich hertragen, zu zeigen, dass das nicht immer so sein muss. Zum Teil hat wohl die ereg-Funktionsfamilie in PHP zu diesem Vorurteil beigetragen.
Wenn du aber schon von Entwicklungsaufwand (oder -kosten) sprichst, bedenke: Ein PCRE ist einfacher portierbar als ein Haufen byte-orientierter String-Funktionen, die sich so fast nur in PHP finden. Der PCRE dagegen lässt sich 1:1 in alle Sprachen übernehmen, die die PCRE-Lib ansprechen können, z.B. C(++), Objective-C, Delphi/FreePascal, RealBasic, was-weiß-ich-nicht-noch-alles ... und Perl sowieso.
Nach diesem Lieber-Hardwarekosten-statt-Softwarekosten-Paradigma wären alle C- und erst recht C++-Programmierer arbeitslos. Und ich halte Hardware immer noch für eine physisch begrenzte Ressource. Dass das heut zu Tage gerne anders gesehen wird, ist mir aber schon klar. ;-)
Danke, strspn() war die Funktion, die ich gesucht, aber nicht gefunden hatte -- um die Funktion des Regulären Ausdruckes rein String-Funktionen-basiert zu machen. Sie scheitert allerdings spätestens bei Umlauten an der Unicode-Hürde, wo wir dann wieder bei den Entwicklungskosten wären ... ;-)
Sie prüft ja das Vorhandensein von EINEM ('position === position') oder KEINEM ('FALSE === FALSE') Punkt.
Bei substr_count() müsstest du das Ergebnis auf Gleichheit mit 1 oder 0 prüfen. Das ginge in einem Rutsch mit 'substr_count() < 2', wenn sich substr_count() auf ewig an die Angaben im Handbuch hält, dass es INTeger zurückliefert, die größer oder gleich 0 sind.
*nachtrag*
Irgendwie bin ich heute zu langsam ... ;-)
Mach mal. ;-) Nein -- Sie[1] haben natürlich recht. Wenn (mindestens) ein Punkt vorhanden ist, dann sollten beide Funktionen kein FALSE liefern.
Die hier?
Keine horizontalen Scrollbalken
Informatiker sind FAUL! Folglich mag hier niemand eine horizontale Scrollbar nach rechts bewegen. Achtet also beim Posten darauf, dass ihr bei "breitem" Quelltext entsprechende Umbrüche in den Text einfügt, so dass euer Posting bei einer Auflösung von 1024 Pixeln (Breite) ohne Hindernisse zu lesen ist.
Du bist also Informatiker? ;-)
Meine nicht (ebenfalls 1024 Pixel in der Waagerechten).
Woher soll ich wissen, wann deine Auflösung gesprengt wird?
Gibts die Angabe einer maximalen Zeichenzahl pro Zeile, oder kann ich die Überschreitung eines Zeilenbreiten-Limits irgendwie anders verifizieren?
--
[1] Reden wir uns heute mit Sie an?
Original geschrieben von ghostgambler
Lieber 3 String-Funktionen auf einen String als einen Regex von einer Zeile Länge.
Lieber 3 String-Funktionen auf einen String als einen Regex von einer Zeile Länge.
Mhmmm, mal sehen:
Du fragst 4 Bedingungen ab, die du über drei Zeilen verteilst, ich nur eine auf einer Zeile.
Wenn wir mal nur die "Kernabfragen" vergleichen:
strspn($string, "abcdefghijklmnopqrstuvwxyz0123456789_.") == $len;
vs.
preg_match('/\A(?=[^\.]{0,10}(?:\.[^\.]{0,10})?)[a-z0-9_.]{4,10}\z/', $string);
Okay, du hast 13 Tastendrücke gespart. ;-)
Probleme bekämst du nur, wenn sich die Anforderung ändern würde, und bspw. zusätzlich Großbuchstaben erlaubt werden würden.
Nebenbei könnte man den PCRE natürlich auch umbrechen und Newbie-tauglich formatieren. Guckst du hier:
PHP-Code:
$pcre = '/\A # am Anfang verankern
(?=[^\.]{0,10}(?:\.[^\.]{0,10})?) # maximal ein Punkt darf vorhanden sein[1]
# UND
[a-z0-9_.] # nur die Zeichen a--z, 0--9, _ und . dürfen vorkommen
{4,10} # es dürfen 4--10 Zeichen sein,
\z/x'; // am Ende verankern
/*
für noch genauere Erläuterungen siehe PCRE-Manual zu
Lookahead-Assertions "(?=...)" und
"non-capturing subpatterns" (?:...)".
*/
Entwicklungs-Kosten sind deutlich höher als Hardware-Kosten.
Wenn du aber schon von Entwicklungsaufwand (oder -kosten) sprichst, bedenke: Ein PCRE ist einfacher portierbar als ein Haufen byte-orientierter String-Funktionen, die sich so fast nur in PHP finden. Der PCRE dagegen lässt sich 1:1 in alle Sprachen übernehmen, die die PCRE-Lib ansprechen können, z.B. C(++), Objective-C, Delphi/FreePascal, RealBasic, was-weiß-ich-nicht-noch-alles ... und Perl sowieso.
Nach diesem Lieber-Hardwarekosten-statt-Softwarekosten-Paradigma wären alle C- und erst recht C++-Programmierer arbeitslos. Und ich halte Hardware immer noch für eine physisch begrenzte Ressource. Dass das heut zu Tage gerne anders gesehen wird, ist mir aber schon klar. ;-)
Es geht übrigens auch ganz ohne preg:
PHP-Code:
function check($string) {
$len = strlen($string);
return $len >= 4 && $len <= 10
&& strpos($string, ".") === strrpos($string, ".")
&& strspn($string, "abcdefghijklmnopqrstuvwxyz0123456789_.") == $len;
}
Original geschrieben von CadEx
Diese Idee mit dem strpos() === strrpos() finde ich echt kreativ!
Aber könnte man nicht einfach ein substr_count() == 1 machen?
Oder hat die andere Variante irgendwelche Vorteile?
Diese Idee mit dem strpos() === strrpos() finde ich echt kreativ!
Aber könnte man nicht einfach ein substr_count() == 1 machen?
Oder hat die andere Variante irgendwelche Vorteile?
Bei substr_count() müsstest du das Ergebnis auf Gleichheit mit 1 oder 0 prüfen. Das ginge in einem Rutsch mit 'substr_count() < 2', wenn sich substr_count() auf ewig an die Angaben im Handbuch hält, dass es INTeger zurückliefert, die größer oder gleich 0 sind.
*nachtrag*
Irgendwie bin ich heute zu langsam ... ;-)
Original geschrieben von ghostgambler
Nebenbei machen wir uns jetzt bewusst, dass diese Einschränkung für den vorliegenden Fall vollkommen irrelevant ist.
Oder möchten Sie mir einen String kreieren, wo die eine Funktion einen Punkt an der ersten Stelle findet, die zweite Funktion dann jedoch keinen Punkt findet? Ich glaube ich vermag einwandfrei zu beweisen, dass es einen derartigen String nicht geben wird... entweder liefern beide Funktionen False, oder sie liefern beide einen numerischen Wert.
Nebenbei machen wir uns jetzt bewusst, dass diese Einschränkung für den vorliegenden Fall vollkommen irrelevant ist.
Oder möchten Sie mir einen String kreieren, wo die eine Funktion einen Punkt an der ersten Stelle findet, die zweite Funktion dann jedoch keinen Punkt findet? Ich glaube ich vermag einwandfrei zu beweisen, dass es einen derartigen String nicht geben wird... entweder liefern beide Funktionen False, oder sie liefern beide einen numerischen Wert.
Übrigens, Forenregeln!
Keine horizontalen Scrollbalken
Informatiker sind FAUL! Folglich mag hier niemand eine horizontale Scrollbar nach rechts bewegen. Achtet also beim Posten darauf, dass ihr bei "breitem" Quelltext entsprechende Umbrüche in den Text einfügt, so dass euer Posting bei einer Auflösung von 1024 Pixeln (Breite) ohne Hindernisse zu lesen ist.
Du bist also Informatiker? ;-)
Dein Code sprengt meine Auflösung von >1024.
Woher soll ich wissen, wann deine Auflösung gesprengt wird?
Gibts die Angabe einer maximalen Zeichenzahl pro Zeile, oder kann ich die Überschreitung eines Zeilenbreiten-Limits irgendwie anders verifizieren?
--
[1] Reden wir uns heute mit Sie an?
Kommentar