[PHP] preg_match() - Wie richtig?

M3Y3R

Well-known member
ID: 336361
L
8 Mai 2006
1.608
60
Hallo,

ich möchte gerne einen String auf Sonderzeichen überprüfen. Das mache ich so:
PHP:
if(!preg_match("/[A-Z0-9]$/is",$temp_name[$i]))
{
echo "Keine Sonderzeichen!";
}

Nun soll aber auch der Backslash erlaubt sein.
Wie funktioniert das dann?
Wer kann mir helfen?

MFG
Papenburger
 
Probier mal statt [A-Z0-9]:
[A-Z0-9\\]

Außerdem solltest du vielleicht noch ein + hinter die schließende eckige Klammer setzen und vor die öffnende eckige Klammer ein ^ hin, sonst matcht bei dir, wenn ich das richtig sehe, jeder String, der nicht auf ein "Sonderzeichen" endet.

Also: ^[a-z0-9\\]+$
(oder * statt +, wenn der String auch leer sein darf)
 
Probier mal statt [A-Z0-9]:
[A-Z0-9\\]

Außerdem solltest du vielleicht noch ein + hinter die schließende eckige Klammer setzen und vor die öffnende eckige Klammer ein ^ hin, sonst matcht bei dir, wenn ich das richtig sehe, jeder String, der nicht auf ein "Sonderzeichen" endet.

Also: ^[a-z0-9\\]+$
(oder * statt +, wenn der String auch leer sein darf)

Dann kommt folgende Fehlermeldung:
Warning: preg_match() [function.preg-match]: Compilation failed: missing terminating ] for character class at offset 12 in /share/sap/eintrag.php on line 35
 
Zuletzt bearbeitet:
Code:
"/^[A-Z0-9\\\]*$/is"
Ich glaub das willst haben.

Die ersten beiden Backslash werden umgewandelt in einen Backslash und dann wird damit der dritte Backslash escaped an die regex-Maschine übergeben.
 
Zuletzt bearbeitet:
Hm.. ist das echt so? Das würde mich extrem überraschen! :)

Ich glaube sogar das man "/^[A-Z0-9\\\\]*$/is" braucht ^^
ersteinmal escaped php mit dem backslash und anschliessend nochmal der regex..
also "/^[A-Z0-9\\\\]*$/is"
nach php escape-> "/^[A-Z0-9\\]*$/is"
und RexEx macht dann aus den letzten zwei backslashes sein Backslash das er dann als zeichen sucht.

so am rande(fals nciht beabsichtigt): [A-Z] erkennt nur GROSSbuchstaben
[a-Z] würde es tun, oder einfach [\w] nehmen.. wobei ich mir grade nicht so ganz sicher bin ob die umlaute dort als sonderzeichen oder buchstabe erkannt werden.

www.regularexpressions.info

sonst einfach mal hier reinschaun.. wird recht gut erklärt.
nu aber @bett..
nachti
 
Ich glaube sogar das man "/^[A-Z0-9\\\\]*$/is" braucht ^^

Richtig, mit drei Backslashes funktioniert es zwar auch, aber nur, weil PHP nicht wirklich weiß, was es mit dem dritten anfangen soll, und dann einfach stehen lässt. Kommt man aber in Zukunft auf die Idee, vielleicht auch noch ein Anführungszeichen o.ä. zu erlauben und setzt dieses einfach dahinter, würde der Backslash dieses escapen und der Regex-Parser würde wieder Probleme kriegen.

Deshalb: In PHP alle Backslashes escapen, auch wenn es nicht zwingend notwendig ist. Backslashes in regulären Ausdrücken müssen natürlich ebenfalls escapet werden, darum sollte man beim Entwerfen der Ausdrücke immer "rückwärts" denken:
1. Gedanke: "Ich suche einen Backslash"
1. Codevorschlag: \
2. Gedanke: "In regulären Ausdrücken müssen Sonderzeichen escapet werden."
2. Codevorschlag: \\
3. Gedanke: "In PHP müssen Sonderzeichen escapet werden."
Endgültiger Code: \\\\​
Besonders wichtig wird dieses Vorgehen, wenn man komplexere Ausdrücke braucht, in denen z.B. mehrere Backslashes oder andere Sonderzeichen hintereinander stehen.

P.S.: Wir haben auch einen "Regex-Übungsthread"
 
beurk.. darum verwende ich wohl zumindest immer da dann einfache Anführungszeichen: '
Dann kann der Spaß nicht passieren.. hatte ich bei mir nicht berücksichtigt. Ich hab nur auf den RegExp geschaut -- und den dann in die Anführungszeichen reinkopiert.

Zur Groß-/Kleinschreibung:
i (PCRE_CASELESS)
Wenn dieser Modifikator gesetzt ist, passen Buchstaben im Suchmuster sowohl auf groß- als auch auf kleingeschriebene Buchstaben.
(Drin! 8))
 
beurk.. darum verwende ich wohl zumindest immer da dann einfache Anführungszeichen: '
Dann kann der Spaß nicht passieren.. hatte ich bei mir nicht berücksichtigt.
Falsch, auch in einfachen Anführungszeichen sollte man escapen, da PHP auch innerhalb von diesen unescapet (diese Sprache...)
PHP:
echo "Hallo\Welt"; // Hallo\Welt
echo "Hallo\\Welt"; // Hallo\Welt
echo 'Hallo\Welt'; // Hallo\Welt
echo 'Hallo\\Welt'; // Hallo\Welt
echo 'Hallo\\'; // Hallo\
echo 'Hallo\'; // FEHLER!