3840 Stimmen

PHP: Nur bestimmte Buchstaben, Zahlen und Zeichen in einem String zulassen

Tipp von Stefan Trost | Letztes Update am 07.05.2024 | Erstellt am 19.01.2013

Heute möchte ich euch zeigen, wie ihr einen String mit PHP dahingehend prüfen könnt, ob dieser nur aus bestimmten Buchstaben, Zahlen oder Zeichen besteht.

Ein Anwendungsgebiet wäre zum Beispiel das Prüfen von Nutzereingaben wie beispielsweise Benutzernamen oder andere Eingaben, die nur aus bestimmten Zeichen oder Zeichengruppen bestehen dürfen.

Grundlagen

Wir schauen uns dazu zunächst den folgenden PHP-Code an:

if (preg_match("#^[a-zA-Z0-9]+$#", $text)) {
   echo 'String enthält nur Buchstaben und Zahlen.';
} else {
   echo 'String enthält auch andere Zeichen.';
}

Mit diesem Code möchten wir überprüfen, ob der String $text nur aus Klein- und Großbuchstaben (a bis z sowie A bis Z) oder Zahlen (Ziffern 0 bis 9) besteht. Dafür verwenden wir die Funktion preg_match() mit einem regulären Ausdruck. Diesen übergeben wir als ersten Parameter an preg_match(), wobei der eigentliche reguläre Ausdruck zwischen "#" und "#" steht.

Das Zeichen ^ steht für den Anfang des Strings, das Zeichen $ für das Ende des Strings. Damit stellen wir sicher, dass der gesamte String überprüft wird und matchen muss und nicht nur Teile davon. Dazwischen dürfen alle Zeichen aus der Zeichenklasse, die wird durch die eckigen Klammern definiert haben beliebig oft vorkommen. Dies haben wir mit dem Plus hinter den eckigen Klammern ausgedrückt. Innerhalb der Zeichenklasse haben wir "a-z" für die Kleinbuchstaben, "A-Z" für die Großbuchstaben und "0-9" für die Ziffern notiert.

Auf verschiedene Zeichen und Zeichenklassen prüfen

Natürlich sind wir bei unserer Prüfung nicht nur auf diese Zeichenklassen beschränkt, sondern können unseren regulären Ausdruck beliebig erweitern oder verändern.

Einige Beispiele dafür sowie weitere Abwandlungen dieser Testung möchten wir uns in den folgenden Abschnitten dieses Tutorials ansehen:

Auch auf Umlaute überprüfen

Naturgemäß sind die deutschen Umlaute wie Ä, Ö oder Ü noch nicht in der in unserem ersten Beispiel verwendeten Zeichenklasse A-Z enthalten, können aber natürlich in normalen deutschen Worten vorkommen. Wollen wir auch diese Zeichen zulassen, müssen wir sie daher extra separat notieren (hier sowohl in ihrer klein als auch in ihrer groß geschriebenen Variante):

if (preg_match("#^[a-zA-Z0-9äöüÄÖÜ]+$#", $text)) {
   echo 'String enthält nur Buchstaben inklusive Umlaute und Zahlen.';
} else {
   echo 'String enthält auch andere Zeichen.';	
}

Wir können auf diese Weise beliebige andere Zeichen mit in die Zeichenklasse aufnehmen, um auch auf diese Zeichen zu prüfen beziehungsweise auch diese Zeichen in unserem String zu erlauben. In der selben Weise könnten wir zum Beispiel auch mit dem Buchstaben ß verfahren:

if (preg_match("#^[a-zA-ZäöüÄÖÜß]+$#", $text)) {
   echo 'String enthält nur die im deutschen vorkommenden Buchstaben.';
} else {
   echo 'String enthält auch andere Zeichen.';	
}

Allerdings kann diese Vorgehensweise sehr umständlich werden, wenn wir uns überlegen, wie viele Varianten allein der lateinischer Buchstaben existieren. Zum Glück ist die Erstellung einer solchen Liste aller Buchstabenvarianten aber auch gar nicht nötig, wie der nächste Abschnitt zeigt. Aus diesem Grund sollten wir den hier gezeigten Ansatz nur dann verwenden, wenn wir wirklich nur eine begrenzte Auswahl an Buchstaben erlauben möchten, wie hier die deutschen Buchstaben.

Auf Buchstaben generell prüfen

Bisher haben wir uns nur auf die deutschen Buchstaben inklusive der Umlaute und ß beschränkt und unsere Zeichengruppe definiert, indem wir jeden Buchstaben explizit in unsere Zeichenklasse geschrieben haben.

Wie aber testet man idealerweise, wenn man auch andere Buchstaben wie è, ø, é oder ă zulassen möchte? Schließlich können wir nicht alle erdenklichen Buchstaben in unseren regulären Ausdruck hinein schreiben. Das folgende Beispiel zeigt daher eine alternative Möglichkeit:

$text = "abcABCäöüÄÖÜßéëèâøçñúœЖЛЩΘΨ";

if (preg_match("#^\p{L}+$#u", $text)) {
   echo 'String enthält beliebige Buchstaben.';	
}

L steht hier für einen beliebigen Buchstaben, \p für ein Zeichen mit der in den geschweiften Klammern dahinter definierten Eigenschaften und u für Unicode. Dieser reguläre Ausdruck prüft also auf beliebige, beliebig oft wiederholte Zeichen mit einem Unicode-Codepoint aus der Kategorie "Buchstabe". Das heißt, dieser reguläre Ausdruck matcht zwar beliebige Buchstaben wie Ë, Ç, Â, Ñ, Ú, Ö oder Œ, liefert aber false sobald zum Beispiel eine Zahl oder ein Satzzeichen in dem zu prüfenden Text vorkommen sollte. Mit "Buchstaben" sind hier übrigens nicht nur die genannten lateinischen Buchstaben genannt, sondern auch Buchstaben aus anderen Alphabeten wie zum Beispiel kyrillische oder griechische Buchstaben. Der in der Variable $text gesetzte String aus dem Beispielcode würde demnach matchen.

Mit L lassen wir sowohl Kleinbuchstaben als auch Großbuchstaben zu. Möchten wir dagegen nur auf kleine oder nur auf große Buchstaben prüfen, können wir statt L "Ll" (Letters lowercase) oder "Lu" (Letters uppercase) verwenden. Möchten wir nur lateinische Buchstaben zulassen, können wir "Latin" ausschreiben, analog können wir zum Beispiel auch auf "Arabic", "Braille", "Cyrillic", "Egyptian_Hieroglyphs", "Georgian", "Greek", "Han" (Chinesisch), "Hebrew", "Hiragana", "Katakana" (beides Japanisch), "Thai" und einige andere Alphabete checken.

Diese \p{x}-Erweiterung wurde in der PHP-Version 5.1.0 hinzugefügt, lässt sich also nicht mit älteren PHP-Versionen verwenden, in denen man stattdessen entsprechend auf die Verwendung der zuvor vorgestellten normalen Zeichenklassen zurückgreifen muss. Bei der Verwendung dieser Extension sollten wir darüber hinaus beachten, dass ein solcher Check auf Unicode-Eigenschaften aufgrund der Vielzahl von Unicode-Zeichen nicht besonders schnell ist.

Auf alle Buchstaben und Zahlen prüfen

In den ersten Code-Beispielen dieses Tutorials hatten wir neben den durch Zeichenklassen oder Einzeldefinitionen zugelassenen Buchstaben auch auf Zahlen in unserem String geprüft beziehungsweise deren Vorkommen erlaubt.

Wenn wir auch das Beispiel aus dem letzten Abschnitt um Zahlen erweitern möchten, um sowohl beliebige Buchstaben als auch beliebige Ziffern zu erlauben, können wir den Check dafür folgendermaßen abwandeln:

if (preg_match("#^[\p{L}0-9]+$#u", $text)) {
   echo 'String besteht aus beliebigen Buchstaben und/oder den Ziffern 0 bis 9.';	
}

Durch die eckigen Klammern haben wir eine Zeichenklasse definiert, die mit \p{L} aus beliebigen Buchstaben sowie mit 0-9 aus den Ziffern 0 bis 9 besteht und sich beliebig oft wiederholen darf.

Dieser reguläre Ausdruck wird neben den Buchstaben wirklich nur für die Zahlen 0 bis 9 true. Sobald unser String jedoch andere Zahlen-Zeichen wie zum Beispiel die hochgestellte ² oder ³ enthält, schlägt die Prüfung fehl. Ähnlich wie zuvor bei den Buchstaben müssen wir uns nun aber abermals nicht die Mühe machen, alle möglichen Zahlen-Zeichen aufzulisten (es sei denn natürlich, wir möchten nur eine bestimmte Auswahl erlauben), wenn wir zusätzlich auch diese Zeichen erlauben möchten. Stattdessen können wir wieder mit der \p{}-Notation arbeiten und dieses Mal den Buchstaben "N" für sämtliche numerischen Zeichen verwenden:

if (preg_match("#^[\p{L}\p{N}]+$#u", $text)) {
   echo 'String besteht aus beliebigen Buchstaben und/oder numerischen Zeichen.';	
}

Wie zu sehen ist, haben wir nun eine Zeichenklasse aus \p{L} (beliebige Buchstaben) sowie \p{N} (beliebige Zahlen-Zeichen) gebildet.

Wichtig: Eine Notation wie \p{LN} oder dergleichen ist nicht möglich. Wir müssen hier beides in der gezeigten Form einzeln schreiben.

Nur Buchstaben oder nur Zahlen zulassen

Zusammenfassend möchten wir uns nun ansehen, wie wir die bisher kennengelernten Definitionen von Zeichenklassen innerhalb von regulären Ausdrücken nutzen können, um einen String nicht gleichzeitig auf mehrere Gruppen von Zeichen zu testen sondern nur um eine bestimmte Zeichengruppe zuzulassen, um damit festzustellen, welcher Zeichenklasse ein String angehört.

Dazu schauen wir uns im folgenden zwei Beispielcodes an, mit denen wir prüfen, ob ein String ausschließlich aus Buchstaben oder ausschließlich aus Zahlen besteht. Fangen wir mit den Buchstaben an:

if (preg_match("#^[A-Z]+$#", $s)) {
   echo 'String besteht nur aus Großbuchstaben von A bis Z.';
} else if (preg_match("#^[a-z]+$#", $s)) {
   echo 'String besteht nur aus Kleinbuchstaben von a bis z.';
} else if (preg_match("#^[A-Za-z]+$#", $s)) {
   echo 'String besteht nur aus Groß- und Kleinbuchstaben von A bis Z.';
} else if (preg_match("#^[\p{Latin}]+$#u", $s) && preg_match("#^[\p{Lu}]+$#u", $s)) {
   echo 'String besteht nur aus lateinischen Großbuchstaben.';
} else if (preg_match("#^[\p{Latin}]+$#u", $s) && preg_match("#^[\p{Ll}]+$#u", $s)) {
   echo 'String besteht nur aus lateinischen Kleinbuchstaben.';
} else if (preg_match("#^[\p{Latin}]+$#u", $s)) {
   echo 'String besteht nur aus lateinischen Buchstaben.';
} else if (preg_match("#^[\p{Lu}]+$#u", $s)) {
   echo 'String besteht nur aus Großbuchstaben.';
} else if (preg_match("#^[\p{Ll}]+$#u", $s)) {
   echo 'String besteht nur aus Kleinbuchstaben.';
} else if (preg_match("#^[\p{L}]+$#u", $s)) {
   echo 'String besteht nur aus Buchstaben.';
} else {
   echo 'String enthält andere oder gemischte Zeichen.';
}

Dieser Code prüft den String $s dahingehend, ob er nur aus Buchstaben einer bestimmten Gruppe besteht. Wir beginnen damit zu prüfen, ob $s nur Großbuchstaben von A bis Z enthält. Ist dies nicht der Fall, prüfen wir als nächstes auf die Kleinbuchstaben von a bis z und anschließend auf Groß- und Kleinbuchstaben von A bis Z (an diesem Punkt würden also nicht nur "ABC" oder "abc" matchen sondern auch "Abc"). Falls dies auch nicht der Fall ist, prüfen wir weiter auf große, kleine oder allgemeine lateinische Buchstaben (also neben den Buchstaben von A bis Z auch auf andere lateinische Buchstaben wie Umlaute oder Akzente), danach auf generelle Großbuchstaben (der String darf neben A bis Z, Umlauten und Akzenten nun auch Buchstaben aus anderen Alphabeten enthalten, so lange sie groß geschrieben sind), auf generelle Kleinbuchstaben und zuletzt auf generelle Buchstaben (also sowohl Klein- als auch Großbuchstaben mit oder ohne Akzenten aus beliebigen Alphabeten). Falls der zu prüfende String keine dieser Gruppen eindeutig zuzuordnen ist, geben wir zuletzt eine Default-Meldung aus. Die Prüfung auf lateinische Klein- und Großbuchstaben haben wir hier aus zwei Einzelprüfungen (Prüfung auf lateinische Buchstaben + Prüfung auf Großbuchstaben versus Prüfung auf Kleinbuchstaben) zusammengesetzt, da wir nur entweder "Latin" oder "Lu" / "Ll" verwenden können.

Eine ähnliche Prüfung können wir auch für Zahlen programmieren:

if (preg_match("#^[0-9]+$#", $s)) {
   echo 'String besteht nur aus den Ziffern von 0 bis 9.';
} else if (preg_match("#^[\p{N}]+$#u", $s)) {
   echo 'String besteht nur aus numerischen Zeichen.';
} else {
   echo 'String enthält andere oder gemischte Zeichen.';
}

Hier wird zuerst geprüft, ob $s ausschließlich aus den Ziffern 0 bis 9 besteht. Ist dies nicht der Fall, so wird auf generelle numerische Zeichen geprüft. Auf dieser Stufe dürfte unser String also neben den Ziffern von 0 bis 9 auch andere Zahlen-Zeichen enthalten wie beispielsweise ² oder ½. Wenn auch dies nicht der Fall ist, geben wir eine Default-Meldung aus. Diese würde zum Beispiel angezeigt werden, wenn wir einen String testen würden, der Buchstaben oder Satzzeichen enthielte.

Nur bestimmte Einzelzeichen zulassen

Bisher haben wir uns in diesem Tutorial hauptsächlich um Zeichenklassen wie beispielsweise alle denkbaren Großbuchstaben, alle Kleinbuchstaben, alle möglichen Ziffern oder alle lateinischen Buchstaben gekümmert. Wir können jedoch auch in derselben Weise verfahren, wenn wir nur eine bestimmte Auswahl einzelner spezieller Buchstaben oder Zeichen in unserem String zulassen möchten.

Dazu ist es ausreichend, einfach die Buchstaben, die wir zulassen möchten, einzelnen in unseren regulären Ausdruck zu schreiben, wie das nächste Beispiel zeigt:

if (preg_match("#^[abx]+$#", $text)) {
   echo 'String besteht nur aus den Buchstaben a, b und x.';
}

Hier testen wir ausschließlich auf die Buchstaben a, b und x. Das heißt, Strings wie "aaa", "bax" oder "bab" wären erlaubt, sobald jedoch ein einziges anderes Zeichen innerhalb des Strings auftaucht, wäre dieser Ausdruck false.

Natürlich können wir auch Buchstaben und Zahlen nach Belieben mischen. Beispielsweise möchten wir mit dem folgenden Code ausschließlich kleingeschriebene Vokale, das großgeschriebene X sowie die Ziffern 2, 3 und 7 erlauben:

if (preg_match("#^[aeiou237X]+$#", $text)) {
   echo 'String besteht nur aus Vokalen, X und den Ziffern 2, 3 und 7.';
}

Wenn wir mehrere Buchstaben erlauben möchten, die hintereinander im Alphabet stehen, können wir diese auch in Form einer Zeichenklasse definieren. Wir können die bisher kennengelernten Zeichenklassen also nicht nur insgesamt verwenden (wie zum Beispiel in der Form "A-Z") sondern auch Teilbereiche auswählen, wie die nächsten beiden Beispiele zeigen:

if (preg_match("#^[C-H]+$#", $text)) {
   echo 'String besteht nur aus den Buchstaben C, D, E, F, G und H.';
}

In diesem Beispiel haben wir den Teilbereich C bis H ausgewählt. Der Ausdruck wird entsprechend nur für Strings true, die ausschließlich aus den Buchstaben C, D, E, F, G und H bestehen.

if (preg_match("#^[a-oq-z]+$#", $text)) {
   echo 'String besteht nur aus den Kleinbuchstaben a bis z außer p.';
}

Und in diesem Beispiel möchten wir alle Kleinbuchstaben von a bis z außer den Kleinbuchstaben p erlauben. Aus diesem Grund haben wir, um p auszuschließen, sowohl die Zeichenklasse a bis o als auch die Zeichenklasse q bis z in unseren regulären Ausdruck geschrieben.

Leerzeichen zulassen

Das Hinzufügen beliebiger Zeichen zu unserem regulären Ausdruck gilt übrigens nicht nur für Buchstaben oder Zahlen sondern zum Beispiel auch für Leerzeichen. Im nächsten Beispiel haben wir ein Leerzeichen in eine Zeichenklasse aus Buchstaben und Ziffern aufgenommen:

if (preg_match("#^[a-zA-Z0-9 ]+$#", $text)) {
   echo 'String enthält nur Buchstaben, Zahlen und Leerzeichen.';
} else {
   echo 'String enthält auch andere Zeichen.';	
}

Damit sind auch Strings erlaubt, die nicht nur aus den angegebenen Buchstaben und Ziffern bestehen, sondern auch Leerzeichen enthalten.

Natürlich können wir das Leerzeichen stattdessen auch zu unser kennengelernten Zeichenklasse [\p{L}\p{N} ] hinzufügen, um Leerzeichen sowie beliebige Buchstaben und Zahlen-Zeichen zu erlauben statt nur Leerzeichen sowie die Buchstaben und Ziffern a-z, A-Z und 0-9.

Punkte, Klammern und andere Sonderzeichen

Einige Zeichen haben eine spezielle Bedeutung innerhalb eines regulären Ausdrucks. Dazu gehören zum Beispiel Punkte oder Klammern. Wollen wir diese Zeichen in unsere Zeichenklasse aufnehmen, müssen wir dies auf die folgende Weise notieren:

if (preg_match("#^[a-zA-Z0-9äöüÄÖÜ \.\]]+$#", $text)) {
   echo 'String enthält nur die genannten Zeichen.';	
}

Mit dem \ können wir die betreffenden Zeichen escapen. Das heißt: Mit dem \ sagen wir, dass das nachfolgende Zeichen als Zeichen und nicht als reguläre Anweisung zu verstehen ist. So fügen wir im Beispiel einen Punkt und eine eckige Klammer zu unserer Zeichenklasse hinzu. Interessant am Ende: Die letzte eckige Klammer ist der Abschluss unserer Zeichenklasse, während die vorletzte eckige Klammer mit einem \ versehen ist und damit zum Teil der Zeichenklasse wird.

Was aber, wenn wir auch das Zeichen \ zu unserer Klasse hinzufügen möchten? Ganz einfach: Auch das Zeichen \ lässt sich escapen - wir müssten also einfach \\ schreiben.

Insgesamt gibt es 15 verschiedene Zeichen, die innerhalb von regulären Ausdrücken eine besondere Bedeutung haben und die wir aus diesem Grund auf diese Weise escapen müssen. Zu diesen Metazeichen gehören [ ] ( ) { } | ? + - * ^ $ \ sowie der Punkt. Mehr zu diesem Thema erfahren Sie in dem Grundlagen-Tutorial für reguläre Ausdrücke.

Inverse Suche

In unseren bisherigen Beispielen haben wir immer positiv auf die Existenz unserer gewählten Zeichenklasse reagiert. Wir können unsere Suche aber auch umkehren, indem wir unsere if-Abfrage durch ein Ausrufezeichen negieren. Den Unterschied verdeutlichen die nächsten beiden Beispiele:

if (preg_match("#^[a-z]+$#", $text)) {
   echo 'String enthält nur Kleinbuchstaben.';
}

Dieser Code zeigt eine nicht umgekehrte Suche nach beliebigen Kleinbuchstaben von a bis z. Unsere if-Bedingung ist entsprechend erfüllt, sobald $text nur aus diesen Kleinbuchstaben und keinen sonstigen Buchstaben oder Zeichen besteht.

Nun drehen wir die Suche um, indem wir das erwähnte Ausrufezeichen vor den Aufruf von preg_match() stellen, unseren regulären Ausdruck jedoch beibehalten:

if (!preg_match("#^[a-z]+$#", $text)) {
   echo 'String besteht nicht nur aus Kleinbuchstaben.';
}

Dieses Mal ist unsere if-Bedingung erfüllt, sofern $text auch andere Zeichen außer den erlaubten Kleinbuchstaben enthält. Das heißt, $text kann zwar auch Kleinbuchstaben enthalten, sobald jedoch ein anderes Zeichen wie zum Beispiel eine Zahl oder ein Großbuchstabe in $text vorkommt, ist unsere Bedingung unerfüllt und wir bekommen die entsprechende Ausgabe.

Ob wir in der Praxis eine Positiv-Suche oder eine Negativ-Suche verwenden sollten, hängt natürlich von dem jeweiligen Einsatzgebiet ab und auf das, was wir prüfen möchten.

CType-Funktionen

Für bestimmte, häufig verwendete Zeichenklassen wie lateinische Buchstaben oder Ziffern lassen sich alternativ auch sehr einfach die CType-Funktionen von PHP verwenden. Mehr dazu erfahren Sie in meinem CType String Tutorial.

Der Vorteil der CType-Funktionen ist, dass wir ohne regulären Ausdruck auskommen und diese Funktionen durch diese Spezialisierung eine bessere Performance als das hier verwendete preg_match() haben.

AntwortenPositivNegativDatumStimmen
1220 Stimmen

Super Tutorial, hamma, so gut erklärt hab ich das noch nie gefunden, 1A, weiter so, danke, vielen Dank!
17.09.2013 um 17:05

AntwortenPositiv Negativ
214 Stimmen

Gibt es eine Möglichkeit gegen alle Zeichen und Buchstaben zu prüfen?

Also auch solche, die in anderen Sprachen vorkommen, z.B. é, è, â, ...
12.01.2015 um 21:04

AntwortenPositiv Negativ
915 Stimmen

Guter Vorschlag.

Ich habe eine Möglichkeit auf beliebige Buchstaben zu prüfen zu dem Artikel hinzugefügt.
13.01.2015 um 01:37

Positiv Negativ
Antworten
016 Stimmen

Sehr schönes Tut, auch wenn schon über 3 jahre alt!

Leider muss man 100 Zeichen haben, dann schreibe ich mal was dazu :D Hoffe, dass es OK ist :D
26.07.2016 um 03:18

AntwortenPositiv Negativ
616 Stimmen

Und was hat das mit dem Alter zu tun? Werden Tutorials etwa schlechter mit der Zeit wie ein altes Stück Käse? ;)
26.07.2016 um 03:30

Positiv Negativ
913 Stimmen

...nur wenn der Käse riecht :) :) :)

;)
30.04.2017 um 08:20

Positiv Negativ
913 Stimmen

...schlechter nicht, nur nicht mehr auf dem neusten Stand, aber ich denke, dass dies der TUT-Schreiber schon berücksichtigt hat.
26.02.2018 um 17:33

Positiv Negativ
812 Stimmen

Was in dem Tutorial soll denn deiner Meinung nach nicht mehr auf dem neuesten Stand sein?

Das fände ich jetzt ja mal interessant...
26.02.2018 um 18:12

Positiv Negativ
Antworten
57 Stimmen

Auch wenn der Beitrag etwas älter ist, so funktionieren die Schnipsel ganz gut.

In der Box mit den Leerzeichen fehlt im else-echo am Ende das ;
09.12.2018 um 10:33

AntwortenPositiv Negativ
1113 Stimmen

Das ist das schöne an Code: Er ist nicht so schnell verderblich wie Lebensmittel.

Die Sache mit dem ; ist korrigiert. Vielen Dank für den Hinweis.
09.12.2018 um 11:46

Positiv Negativ
Antworten
Antworten

Über den Autor

AvatarSoftware von Stefan Trost finden Sie auf sttmedia.de. Benötigen Sie eine individuelle Software nach Ihren eigenen Wünschen? Schreiben Sie uns: sttmedia.de/kontakt
Profil anzeigen

 

Ähnliche Themen

Wichtiger Hinweis

Bitte beachten Sie: Die Beiträge auf askingbox.de sind Beiträge von Nutzern und sollen keine professionelle Beratung ersetzen. Sie werden nicht von Unabhängigen geprüft und spiegeln nicht zwingend die Meinung von askingbox.de wieder. Mehr erfahren.

Jetzt mitmachen

Stellen Sie Ihre eigene Frage oder schreiben Sie Ihren eigenen Artikel auf askingbox.de. So gehts.