3739 Stimmen

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

Tipp von Stefan Trost | Letztes Update am 02.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 bestimmte Buchstaben, Zahlen oder Zeichen enthält.

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

Wir schauen uns dazu zunächst den folgenden 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.';
}

Hier 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. 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.

Natürlich sind wir bei unsere Prüfung nicht nur auf diese Zeichenklassen beschränkt, sondern können unseren regulären Ausdruck beliebig erweitern oder verändern. Einige Beispiel dafür sowie weitere Abwandlungen 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 Zeichenklasse a-z oder 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 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. In der selben Weise könnten wir zum Beispiel auch mit dem Buchstaben ß verfahren.

Allerdings kann diese Vorgehensweise sehr umständlich werden, wenn wir uns überlegen, wie viele Varianten 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 beschränkt und unsere Zeichengruppe definiert, indem wir jeden Buchstaben explizit in unsere Zeichenklasse geschrieben haben.

Wie aber testet man, 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.

Mit L lässt man sowohl Kleinbuchstaben als auch Großbuchstaben zu. Möchte man dagegen nur auf kleine oder nur auf große Buchstaben prüfen, kann man statt L "Ll" (Letters lowercase) oder "Lu" (Letters uppercase) verwenden. Diese 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 zuvor vorgestellten normalen Zeichenklassen zurückgreifen muss.

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 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 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 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 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 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 einzeln schreiben.

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 noch ein Leerzeichen in die 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, die nicht nur die angegebenen Buchstaben und Ziffern sondern auch Leerzeichen enthalten erlaubt.

Natürlich können wir das Leerzeichen stattdessen auch zur Zeichenklasse [\p{L}\p{N} ] hinzufügen, um Leerzeichen sowie beliebige Buchstaben und Zahlen 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 so 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, die vorletzte eckige Klammer ist mit einem \ versehen und damit Teil der Zeichenklasse.

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 erfü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 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 preg_match() haben.

AntwortenPositivNegativDatumStimmen
1119 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
113 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
814 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
-115 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
515 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
812 Stimmen

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

;)
30.04.2017 um 08:20

Positiv Negativ
812 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
711 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
46 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
810 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.