RegExp-Pattern so richtig? Wie kann man Fehler besser finden?
Marcel
- php
0 Tom0 Alexander (HH)0 Tom
0 MudGuard
Hallo,
ich habe zwei Fragen: Zum einen versuche ich eine Benutzereingabe durch einen Regulären Ausdruck zu überprüfen. Da diese Art bereits mehrfach erfragt wurde (nicht nur hier sondern eigentlich überall), man aber viele verschiedenste Antworten erhält, würde ich also gern wissen, ob folgende Prüfung zum gewünschten Ergebnis führt. Das gewünschte Ergebnis ist, dass nur Buchstaben, Zahlen und die zwei Zeichen Unter- bzw. Bindestrich erlaubt sind. Meine Idee (zusammengedichtet aus mehreren Antworten, die ich über google gefunden habe):
/^[a-z0-9_-]+$/i
Nun habe ich auch gelesen, dass [a-zA-Z0-9_] gleichbedeutend mit \w sei. Demnach ließe sich meine Idee "verbessern" zu:
/^\w-$/
Eigentlich bin ich mir relativ sicher, dass es funktioniert (zumindest Ersteres), aber vor allem wegen meiner zweiten Frage (s.u.) möchte ich hier noch einmal sichergehen und nachfragen. Ich zweifle eigentlich nur noch leicht an dem Bindestrich, da ich nicht weiß, ob er tatsächlich als Bindestrich erkannt wird, oder ob versucht wird, ein Bereich festzulegen, was dann in einem fehlerhaften Pattern enden dürfte.
Meine zweite Frage bezieht sich mehr auf das Vorgehen zum Finden von Fehlern in einem Abfrage-Pattern. Gibt es eine Systematik, um möglichst viele (gar alle) Fehler zu finden? Klar könnte man diverse offensichtlich falsche und richtige Eingaben machen und die Ergebnisse anschauen. Aber ab und zu sieht man in Foren dann doch überraschende Eingaben, die augenscheinlich richtig sind, aber trotzdem als falsch erkannt werden. So würde ich beispielsweise gern mit meiner Überprüfung auch Umlaute ausschliessen, die einer ASCII Tabelle zu Folge nicht zwischen a und z liegen. Aber ist dies tatsächlich auch der Fall? In einfachen Fällen (so wie mein Beispiel gerade) wären es vielleicht sogar möglich, durch Eingaben die Überprüfung zu kontrollieren und zu verifizieren. Aber bei komplizierten Überprüfungen würde ich nun denken, dass es andere Wege geben wird einen Pattern auf Korrektheit zu überprüfen.
Gruß,
Marcel
Hello,
Nun habe ich auch gelesen, dass [a-zA-Z0-9_] gleichbedeutend mit \w sei. Demnach ließe sich meine Idee "verbessern" zu:
/^\w-$/
Das sehe sogar ich ;-)
So müsste das letzte Zeichen ein Bindestrich sein.
Ist also nicht das, was Du wolltest
Wenn, dann wieder mit den eckigen Klammern. Weiß ich aber auch nicht, ob das eichtig ist.
/^[\w-]$/
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom
Moin Moin!
http://www.php.net/manual/en/reference.pcre.pattern.syntax.php und dort verlinkte Seiten sollten hilfreich sein:
Wenn, dann wieder mit den eckigen Klammern. Weiß ich aber auch nicht, ob das eichtig ist.
/[1]$/
"The character types \d, \D, \s, \S, \w, and \W may also appear in a character class, and add the characters that they match to the class. For example, [\dABCDEF] matches any hexadecimal digit." -- hätte ich jetzt nicht gedacht, ist aber auch in Perl so.
Trotzdem matcht das Pattern nur, wenn der String exakt ein Zeichen lang ist, es fehlt ein "+" vor dem "$".
Wie schon erwähnt sind die Word Characters nicht notwendigerweise auf A-Za-z0-9_ beschränkt. "A 'word' character is any letter or digit or the underscore character, that is, any character which can be part of a Perl 'word'. The definition of letters and digits is controlled by PCRE's character tables, and may vary if locale-specific matching is taking place. For example, in the 'fr' (French) locale, some character codes greater than 128 are used for accented letters, and these are matched by \w."
Alexander
\w- ↩︎
Hello,
Wenn, dann wieder mit den eckigen Klammern. Weiß ich aber auch nicht, ob das eichtig ist.
/[1]+$/
"The character types \d, \D, \s, \S, \w, and \W may also appear in a character class, and add the characters that they match to the class. For example, [\dABCDEF] matches any hexadecimal digit." -- hätte ich jetzt nicht gedacht, ist aber auch in Perl so.
Die Maschinen für die Regular Expressions sind so komplex, dass ich ohnehin immer daran zweifle, ob die dazugehörige Beschreibung wirklich genau zur Maschine passt. Man sieht es ja bei den Browsern, dass es erhebliche Unterschiede gibt. Bei den Regular Expressions wird es irgendwo auch Abweichungen zur eigentlich verbindlichen Beschreibung geben.
Vielleicht sind sie mir deshalb so suspekt, weil ich noch nicht reingeschaut habe, wie sie funktionieren.
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom
\w- ↩︎
Hi,
/^[a-z0-9_-]+$/i
Nun habe ich auch gelesen, dass [a-zA-Z0-9_] gleichbedeutend mit \w sei. Demnach ließe sich meine Idee "verbessern" zu:
/^\w-$/
Nein. Ersteres erlaubt Zeichenfolgen aus mindestens einem Buchstaben, Ziffern, Unterstrich und Bindestrich.
Letzteres Erlaubt _ein_ Zeichen (Buchstabe, Ziffer oder Unterstrich) gefolgt von einem Bindestrich.
/[1]+$/
wäre gleichbedeutend mit ersterem, falls \w dasselbe wie [a-zA-Z0-9_] wäre.
Ist es aber meistens nicht (m.W. nur bei Java).
Je nach Regex-Engine fehlt der _, mal sind zusätzliche Zeichen drin (ggf. alle in Unicode als alphanumeric deklarierten Zeichen, teilweise auch nur die in der Locale gültigen.
Welche genaue Definition PHP verwendet, weiß ich nicht auswendig.
cu,
Andreas
\w- ↩︎