preg_match funktioniert nicht

SilentWarrior

Erfahrenes Mitglied
Hi

Da ich jetzt seit Stunden auf der Suche nach einer Lösung meines Problems bin, es aber immer noch nicht gelöst habe, dachte ich, ich poste lieber mal hier, bevor ich noch einen Anfall bekomme. ;)

Es geht um folgendes: Ich möchte überprüfen, ob ein Dateiname gültig ist oder nicht. Konkret heisst das, er darf keines der folgenden Zeichen enthalten: \, /, :, *, ?, ", <, > und |. Ich habe versucht, das mit preg_match wie folgt zu lösen:
PHP:
$dir = "\\text";
if (preg_match("/[\\/:\*\?\"<>\|]/",$dir)) {
    echo "funktioniert";
} else {
    echo "funktioniert nicht";
}
Leider hab ich nicht wirklich viel Ahnung von der Syntax, die bei preg_match verwendet werden muss. (bei PHP.net war's nur auf englisch vorhanden, und bei SELFHTML hab ich's irgendwie nicht wirklich geschnallt bzw. es wollte einfach nicht funktionieren ;))

Kann mir jemand sagen, wo der Fehler liegt? Ich hab schon mindestens 100 verschiedene Möglichkeiten ausprobiert, doch keine funktioniert. *verzweifel*

Bin dankbar für jede Hilfe! :)

Grüsse

SilentWarrior
 
Es gibt in RegExp nur eine Reihe von Zeichen, welche du escapen musst, falls sie Teil des Ausdrucks sein sollen...
das wären:
\ ^ $ . [ ] | ( ) ? * + { }
dazu kommen noch die beiden Zeichen, die den Ausdruck einschliessen...bei deinem Beispiel also
" /

dein Ausdruck müsste dann so aussehen:
Code:
"/[\/:\*\?\"<>\|]/"

Dein Skript gibt allerdings ein "funktioniert" aus, wenn etwas gefunden wird... sollte doch eher andersrum sein:) ,oder?
 
PHP:
$dir = "\\text";
if (preg_match("/[\/:*?\"<>|]/",$dir)) {
    echo "funktioniert";
} else {
    echo "funktioniert nicht";
}
So funktioniert's leider auch nicht. :(
Dein Skript gibt allerdings ein "funktioniert" aus, wenn etwas gefunden wird... sollte doch eher andersrum sein:) ,oder?
Hm... das muss ich nochmal überdenken. ;)
 
Original geschrieben von rauchi
du hättest ja auch die reg. expr. ausbessern solln ;-)

Jo...würd ich auch sagen ;)
Code:
$dir = "\text";
if (preg_match("/[\/:\*\?\"<>\|]/",$dir)) {
    echo "ungültiger Dateiname";
} else {
    echo "der ist schon besser :o)";
}
 
Oh damn Mist... Scheiss-Forum. :) fatalus, ich hab's genau so gemacht, wie du mir's empfohlen hast dort in dem CODE-Teil. Es klappt trotzdem nicht. Und das wegen dem Überdenken war eigentlich mehr als Witz gemeint, da ich vorerst nur mal überprüfen will, ob preg_match überhaupt tut.
 
:fg:
Jetzt fällts mir auf....du willst ja den Backslash auch finden... der ist bisher ja nicht angegeben, da der erste Backslash ja nur das darauffolgende Slash escaped.
Das alleine reicht aber immer noch nicht...weil $dir innerhalb doppelter Anführungszeichen steht. Dort werden Steuerzeichen erkannt, und \t (in "\text")ist das Steuerzeichen für den Tabulator.
Daher musst du diese Zeichen auch noch ausschliessen(mit \s....das fasst alle diese Zeichen zusammen).
Also..neuer Versuch:
Code:
"/[\/\\:\*\?\"<>\|\s]/"
da fehlt aber immer noch der Punkt, der sollte ja auch vorhanden sein... mein Vorschlag wäre daher:
Code:
if(!preg_match("/^([^\/\\:\*\?\"<>\|\s]*)\.([^\/\\:\*\?\"<>\|\s\.]+)$/",$dir))
{
    echo "ungültiger Dateiname";
}
else
{
    echo "der ist schon besser :o)";
}
 
Zurück