WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   kleines REGEX-Problem (http://www.wcm.at/forum/showthread.php?t=161960)

kingchaos01 23.03.2005 13:58

kleines REGEX-Problem
 
Hallo!
Ich möchte einen String in PHP auf eine Anzahl zulässiger Zeichen prüfen. Bei Vorhandensein eines nicht gültigen Chars soll abgebrochen werden.
Erlaubt sind:
0-9
a-z
_ (Unterstrich)
. (Punkt)
- (Minus)

Meine Versuch dazu:
PHP-Code:

if (!eregi("([_\.0-9a-z-]+)",$filename)) {
      die (
"Uebergabeparameter nicht korrekt!");
  } 

Leider matcht die Regex immer, auch wenn zB ein "\" vorkommt. Der RegexCoach zeigt mir an, dass die Regex dann einen Teil matcht. Ich müsste aber sicherstellen, dass im ganzen String kein "böser" char vorkommt.
Kann mir jemand helfen?

tia
Roland

paux 23.03.2005 15:20

Ohne jetzt groß nachzudenken:

Angenommen es sind nur die Zeichen a und b erlaubt.

test .*[ab].* = Zeichen a oder b kommen vor, die anderen sind völlig frei.
!test .*[ab].* = Es kommt weder a noch b vor.
test .*[^ab].* = Es kommen Zeichen vor, die weder a noch b sind.

Daher möchtest du die dritte Variante nehmen.

lg paux

_m3 23.03.2005 16:00

Einen Punkt "." repäsentiert in einer Regex zumeist ein beliebiges Zeichen, daher muss er im Regelfall mit einem Backslash "\" escaped werden.
Also
Code:

[_\.0-9a-z-]

kingchaos01 23.03.2005 16:02

verh****:
den "\" vor dem Punkt habe ich eh gemacht. Mir schleierhaft, wo der abgeblieben ist.

_m3 23.03.2005 16:19

Also bei mir (perl) hat er mit
Code:

if( $file =~ /[^_\.0-9a-z-]/gi)
den gewünschten Effekt gebracht.

kingchaos01 23.03.2005 16:48

hm, die lösung hab ich jetzt so gefunden:

!preg_match("/^[0-9a-zA-Z_\.-]*$/",$filename)

Das scheint zu funzen!
Es lebe google-groups ;)

Danke für eure Zeit!
Roland

_m3 23.03.2005 16:52

Wäre es mit
Code:

preg_match("/[^0-9a-zA-Z_\.-]/",$filename)
nicht eleganter (und ev. schneller)?

paux 23.03.2005 17:52

@kingchaos01: Das Dacherl gehört wohl in die Klammer, so wie ich es angegeben hatte. Außerdem ist mir nicht klar wieso du das preg_match ver-nicht-est. Du wollst ja testen OB Zeichen vorkommen die NICHT erlaubt sind?

paux 23.03.2005 17:53

[scheißdreck]

kingchaos01 23.03.2005 17:56

hm, ich seh das so:
die regex liefert true, wenn *nur* die werte vom pattern enthalten sind. bei verneinung springt "die" an.
also "if not true, springe in die condition".


Alle Zeitangaben in WEZ +2. Es ist jetzt 08:15 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag