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

kingchaos01 23.03.2005 18:02

Zitat:

Original geschrieben von _m3
Wäre es mit
Code:

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

sieht ganz so aus....
es is zum *ausderhautfahrn* mit diesen regexen.... :eek:
für langsame wie mich nun eine mutmassung: das "^" in der [] verneint alles, was danach kommt, richtig?

Wäre nur noch die Frage, wise preg_match alles matcht, und ereg auch teile....

_m3 23.03.2005 18:09

Zitat:

Original geschrieben von kingchaos01
für langsame wie mich nun eine mutmassung: das "^" in der [] verneint alles, was danach kommt, richtig?
Korrekt. :D

Zitat:

Wäre nur noch die Frage, wise preg_match alles matcht, und ereg auch teile....
preg -> die einzig wahren und wirklichen Perl Regular Expressions
ereg -> Der müde PHP-Abklatsch ;)

Potassium 25.03.2005 11:39

Zitat:

Original geschrieben von _m3


preg -> die einzig wahren und wirklichen Perl Regular Expressions
ereg -> Der müde PHP-Abklatsch ;)

:lol: :lol: :lol:


Alle Zeitangaben in WEZ +2. Es ist jetzt 04:11 Uhr.

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