PHP Reguläre Ausdrücke for dummies

raven16

Lieutenant
Registriert
Nov. 2008
Beiträge
580
Hallo,

hat jemand gute einfache Erklärungen/Links für reguläre Ausdrücke, wo die Varianten Schritt für Schritt erklärt werden?
Hab jetzt viel rumgesucht und versuche z.B. bei einem Formular, wo der Name eingegeben wird nur Groß-/Kleinbuchstaben zu erlauben:

PHP:
if(!preg_match('/[a-zA-Z]$/',$_POST['name'])) echo 'Name ungültig!';

Danke :)
 
Wenn dich das Thema wirklich interessiert und du nicht für jede weitere expression in Foren nachfragen willst, lies das.

Gibt es auch deutsch, falls bevorzugt. Sehr detailliert.
 
http://www.php.net/manual/de/reference.pcre.pattern.syntax.php ist die offizelle PHP-Hilfe für preg_match.

https://de.wikipedia.org/wiki/Regulärer_Ausdruck ist die wiki-seite dazu. passt nicht zwingend 100% auf php, aber ist DEUTLICH einfacher zu verstehen als die unsortierte php-seite.

Für einen Ausdruck konkret: Du hast:
PHP:
/[a-zA-Z]$/

Dabei bedeuten:
/ - Anfang/Ende
$ - Zeilen/Zeichenende
[a-zA-Z]: Ein Klein- oder Großbuchstabe

Um jetzt mehrere Zeichen zu erlauben, brauchst du einen Quantifizierer. Zum Beispiel + (bedeutet der String darf nicht leer sein). also

PHP:
/[a-zA-Z]+$/
 
Zuletzt bearbeitet:
[a-zA-Z]: Ein Klein- oder Großbuchstabe


Code:
 [a-zA-Z]+ (ein oder mehrere lower-, upperalphas, mindestens einer)
Code:
 [a-zA-Z]* (beliebige viele ohne Mindestbeschränkung: 0 oder X L-U-alphas)
Code:
 /[a-z]/i ( ausschalten der Unterscheidung zwischen Upper- und Loweralphas mit dem modifier i)
Code:
 /[a-z]{minNrOfCharacters,maxNrOfCharacters}/i ( z.B.: /[a-z]{0,30}/i)

etc.

Code:
preg_match( '/[a-z]*/i', $_POST['name'] ) || exit;
 
Euch ist schon klar, dass Namen eben nicht nur aus Groß- und Kleinbuchstaben bestehen? Im westlichen Kulturkreis muss man beim Vor- und Nachnamen mindestens noch den Bindestrich zulassen, oftmals ist aber noch ein Leerzeichen nötig.
 
Hab jetzt viel rumgesucht und versuche z.B. [...] nur Groß-/Kleinbuchstaben zu erlauben

Wie sagt man sö schön? "Be careful what you wish for - you just might get it."
 
Zuletzt bearbeitet:
Sicher, er wollte nur Groß- und Kleinbuchstaben... aber wozu? Rein theoretisch könnte man seinen Namen ja auch in Max Power! (mit Ausrufezeichen!) ändern...
 
Danke für die vielen Links. Ich werde mir das auf jedenfall mal anschauen.

Daaron schrieb:
Euch ist schon klar, dass Namen eben nicht nur aus Groß- und Kleinbuchstaben bestehen? Im westlichen Kulturkreis muss man beim Vor- und Nachnamen mindestens noch den Bindestrich zulassen, oftmals ist aber noch ein Leerzeichen nötig.

Guter Einwand!

-----
Hab jetzt mal so ein bisschen gelesen und mir aus anderen Foren was zusammengesucht für mein Namensfeld, wo ich noch kleine Fragen zu habe:
PHP:
if(!preg_match('/^[a-z]+(\s{0,1}|-{0,1})[a-z]*$/i',$_POST['name'])) $errorname = 'Name ist ungültig';

- Habe öfters in anderen Foren gesehen, dass viele ein / direkt am Anfang machen. Wozu dient das?
- Ist es richtig, dass /i am Ende des regex aussagt, dass jedes Zeichen davor Case-Insensitiv behandelt wird?

Ansonsten funktioniert das schon mal soweit ganz gut. Folgendes habe ich jetzt zugelassen: Wenn ich Sonderzeichen eingebe oder z.B. zwei Leerzeichen zwischen den beiden Wörtern, dann bekomme ich eine Fehlermeldung.
Name
Name-Zweitname
Name Zweitname

Eventuelle Verbesserungsvorschläge nehme ich noch gerne entgegen :)
 
Zuletzt bearbeitet:
raven16 schrieb:
- Habe öfters in anderen Foren gesehen, dass viele ein / direkt am Anfang machen. Wozu dient das?
Das sind die Delimiter.
raven16 schrieb:
- Ist es richtig, dass /i am Ende des regex aussagt, dass jedes Zeichen davor Case-Insensitiv behandelt wird?
http://www.regular-expressions.info/modifiers.html
raven16 schrieb:
Eventuelle Verbesserungsvorschläge nehme ich noch gerne entgegen :)
{1} ist redundant, \s betrifft sowieso nur ein einzelnes Whitespace. Auch das Whitespace am Ende ist zweckfrei, da es bei dir vorkommen muss.

Besser wäre:
Code:
^[a-z]+([\s-][a-z]+)?$
Matcht auf einen einfachen Namen wie Hans, aber auch Hans-Peter oder Hans Peter. Der Zweitname muss aber nicht vorkommen.

edit: Noch schnell den Regex abändert... :P

{0,1} ist sinnlos, dafür gibt es ? (kann 0 oder 1 mal vorkommen)
+ ({1,} = muss mindestens 1 mal vorkommen)
* ({0,} = kann 0, 1 oder mehrfach vorkommen)
 
Zuletzt bearbeitet:
Yuuri schrieb:
{0,1} ist sinnlos, dafür gibt es ? (kann 0 oder 1 mal vorkommen)
+ ({1,} = muss mindestens 1 mal vorkommen)
* ({0,} = kann 0, 1 oder mehrfach vorkommen)

Ja gut okay danke :)
+ oder * kam ja bei dem Leerzeichen oder Bindestrich nicht in Frage, weil ich ja nicht möchte, dass es mehr als 1x hintereinander eingegeben werden kann
 
Zurück
Oben