Thema: Ausdruck für Dateinamen (Sonderz. entfernen ...)

Hallo,

ich suche einen umfangreichen regulären Ausdruck, den ich für Dateinamen verwenden kann.
Es sollte z.B. möglich sein, Unter- und Bindestriche, Leerzeichen und Punkte in einem String zu erhalten, wobei diese nicht am Anfang oder am Ende stehen dürfen und auch nicht zweimal hintereinander vorkommen dürfen.
Alle Anderen Zeichen (Sonderzeichen) müssen natürlich entfernt werden.
Ich habe mal etwas angefangen, aber das ist noch nicht ganz das was ich suche.

^[0-9a-zA-Z_ .-]+$
Hierbei können aber noch Unterstrich, Leerzeichen, Punkt und Bindestrich am Anfang und am Ende stehen und sie können zweimal hintereinander vorkommen.

Vielen Dank schonmal und meinen Respekt an alle "regular-expression-Freaks"!  ;-)

Gruss
Plectron

2

Re: Ausdruck für Dateinamen (Sonderz. entfernen ...)

Hi,

du sprichst von Dateinamen. Auf welche Konventionen beziehst du dich da? DOS-Dateinamen haben ja das 8+3-Schema und dürfen keine Leerzeichen enthalten, Windows-Dateinamen können hingegen alle möglichen Zeichen enthalten, außer /,„, und ? und davon 256 Stück, unter *nix-Systemen kann der Punkt auch am Anfang stehen und die Namen dürfen 1024 Zeichen lang sein. Mac OS erlaubt 32 Zeichen, Mac OS X 1024 Zeichen etc. pp.

Liebe Grüße,
Basti

Re: Ausdruck für Dateinamen (Sonderz. entfernen ...)

Ich meinte Windows und *nix Dateinamen.

Mittlerweile habe ich aber die Lösung, die für meine Zwecke ausreicht.
preg_match("@^[0-9a-zA-Z](?:[0-9a-zA-Z]|[ ._-](?![ ._-]))*[0-9a-zA-Z]$@", $str);

Danke trotzdem.

Gruss
Plectron

4

Re: Ausdruck für Dateinamen (Sonderz. entfernen ...)

Folgende Zeichenketten werden z.B. nicht gefunden: "a", "data_.dat", "hallo - welt.txt". Anererseits sind z.B. folgende Zeichenkette erlaubt: "a.t x t" oder "a.t_x-t".

...nur falls das von Bedeutung wäre.

Basti

5

Re: Ausdruck für Dateinamen (Sonderz. entfernen ...)

N'abend plectron,

zwar verstehe ich nicht, was das mit dateinamen, die gültig sein sollen, zu tun hat,
aber ein Zeichen, daß nicht zweimal hintereinander vorkommen darf, wird so formuliert:

 irgendeinZeichen(?!irgendeinZeichen)
 

Wenn sich diese Bedingung auf zwei Zeichen beziehen soll, deren _jeweiligen_ doppelten Vorkommen ausgeschlossen sein sollen, darf man _nicht_ sagen:

 [-,](?![-,])
 

denn das bedeutet:
ein Bindestrich oder ein Komma, _weder_ gefolgt von einem Bindestrich _noch_ von einem Komma,

während

 (?:-(?!-)|,(?!,))
 

heißt:
entweder ein Bindestrich, nicht gefolgt von einem Bindestrich, oder ein Komma, nicht gefolgt von einem Komma.


Ein regulärer Ausdruck, der der Anforderung

" - Es sollte z.B. möglich sein, Unter- und Bindestriche, Leerzeichen und Punkte
in einem String zu erhalten, wobei diese nicht am Anfang oder am Ende stehen
dürfen und auch nicht zweimal hintereinander vorkommen dürfen. - "

insofern entspricht, als daß eben ausschließlich strings gefunden werden,
die weder Leerzeichen, noch Binde_ oder Unterstriche, noch einen Punkt am
Ende oder Anfang aufweisen, und ansonsten aus mindestens einem [a-zA-Z0-9] oder
eben besagten Zeichen bestehen, wobei diese nicht in der Form
ZeichenUndDirektDanachDasGleicheZeichenNocheinmal vorkommen können, kann zB.
so aussehen:

 $l = '[0-9a-zA-Z]';
 $z = '[-._ ]';
 
 preg_match("/^$l(?:$l|(?:($z)(?!\1|$)))*$/", $str);
 

Was Du mit

"Alle Anderen Zeichen (Sonderzeichen) müssen natürlich entfernt werden."

meinst, ist mir in diesem Zusammenhang ebenfalls schleierhaft.
Wann entfernt? Vor dem match, nach dem match? Wieso?
Willst Du strings finden, die einer bestimmten Bedingung entsprechen,
oder willst Du aus irgendwelchen x-beliebigen stringstücken Dir
Dateinamen zusammensetzen, und welchen Sinn hätte dann die Anfang- und Ende-
Bedingung?

Mit leicht verwirrtem gruß

matho