TinTin Geschrieben 28. September 2004 Teilen Geschrieben 28. September 2004 hallo erstmal ... ich möchte gerne einen dateinamen mit preg_match auf ein bestimmtes muster überprüfen, komme aber mit den regulären ausdrücken nicht zurecht. das muster was ich überprüfen will sieht so aus: tb_*.jpg (* soll für alle in einem dateinamen gültigen zeichen stehen) 'tb_' und '.jpg' kann ich unabhängig von einander überprüfen, if (preg_match("/tb_/i",$test) && preg_match("/.jpg/i",$test)) echo "ja"; ich steige nicht durch wie ich dieses muster in einem aufwasch prüfen kann. kann mich bitte jemand duch den wald der RegEx geleiten??? ciao TinTin Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kLeiner_HobBes Geschrieben 28. September 2004 Teilen Geschrieben 28. September 2004 Schau mal hier: http://php-faq.de/q/q-regexp-bauelemente.html Deine Regex sollte IMHO so aussehen: /tb_.*?\.jpg/i Ungetestet Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kills Geschrieben 28. September 2004 Teilen Geschrieben 28. September 2004 versuch doch if ( strpos( $file, "jpg) !== false) { } [/PHP] Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TinTin Geschrieben 28. September 2004 Autor Teilen Geschrieben 28. September 2004 Schau mal hier: http://php-faq.de/q/q-regexp-bauelemente.html Ungetestet den o.g. link hatte ich auch schon gefunden, hat mich aber mehr verwirrt als weitergebracht. Deine Regex sollte IMHO so aussehen: /tb_.*?\.jpg/i Ungetestet getestet, funktioniert!!! danke... ..ber könntest du mir mir den teil '.*?\' etwas erklären, damit ich beim nächsten mal weiss was ich tun muss der punkt z.b: Der Punkt . paßt auf genau ein beliebiges Zeichen außer dem Zeilenendezeichen \n. Das Suchmuster ... paßt also auf alle Strings, die aus genau drei Zeichen bestehen. heist es im o.g. link, da ist aber doch nur ein '.' drin??? ich blick da z.zt. noch nicht durch... TinTin Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kLeiner_HobBes Geschrieben 28. September 2004 Teilen Geschrieben 28. September 2004 Naja, wie schon gesagt wurde: 1. Der Punkt repräsentiert genau ein beliebiges Zeichen (außer newline), also nicht nur einen Punkt. 2. Wenn ich nun das Sternchen hintendransetze, bedeute ich damit die Häufigkeit, in der ein beliebiges Zeichen vorkommt. Der Stern bedeutet 0 bis n-mal. 3. Dahinter habe ich noch ein Fragezeichen gesetzt, was bedeutet, er soll nur bis zum nächstmöglichen .jpg gehen. (Stichwort "greedyness"). Das Fragezeichen kann man aber auch weglassen. Du siehst auch, daß ich den "wirklichen" Punkt von .jpg escapt habe: \. Damit sage ich, daß er wirklich einen Punkt suchen soll. Hoffe, das war halbwegs verständlich Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
DevilDawn Geschrieben 28. September 2004 Teilen Geschrieben 28. September 2004 ..ber könntest du mir mir den teil '.*?\' etwas erklären, damit ich beim nächsten mal weiss was ich tun muss Der Perl-Regex steht zwischen den /-Zeichen. Das am ende stehende i steht für case-insensitive (Gross/Kleinschreibung egal). Der Regex selber ist tb_.*?\.jpg In Worten: Der String muss mit tb_ Anfangen (tb_), gefolgt von beliebig vielen beliebigen Zeichen (.*), dann mindestens ein beliebiges Zeichen (?), dann ein expliziter Punkt (\.) und dann jpg (jpg). Ich bevorzuge bei PHP eher die POSIX-Regex. Dort wäre es if (eregi("^tb_.+\.jpg$",$a)) { ... } [/php] gewesen. .+ passt auf beliebig viele beliebige Zeichen (wie .*), [b]aber mindestens 1 davon[/b]. ^ steht für Stringanfang, $ für Stringende. Also: Stringanfang (^), dann tb_ (tb_), dann mindestens ein beliebiges Zeichen (.+), dann ein Punkt (\.), dann jpg (jpg) und dann Stringende ($). HtH Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kLeiner_HobBes Geschrieben 28. September 2004 Teilen Geschrieben 28. September 2004 @devilDawn: Die POSIX-Funktionen sind allerdings langsamer. Und das Fragezeichen bedeutet in meinem Fall nicht mindestens eins davon, sondern wieviel er "fressen" soll: http://www.php-faq.de/q/q-regexp-gierig.html Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TinTin Geschrieben 28. September 2004 Autor Teilen Geschrieben 28. September 2004 danke für eure erklärungen, jetzt ist mir die ganze sache schon etwas klarer. eine frage habe ich allerdings noch. ich habe meine RegEx so verändert: /^tb_[a-z0-9_-]+\.jpg$/i die funktion läuft jetzt auch so durch. gehe ich richtig in der annahme, dass die abfrage jetztfolgendes überprüft? 1. hat der string 'tb_' (stringanfang) 2. folgt danach mindestens ein zeichen aus der angwegebenen gruppe [a-z0-9_-] 3. dann ein '.' 4. zum schluss ein 'jpg'. (stringende) oder sollte ich noch etwas im ausdruck verändern? danke für eure mühe... TinTin Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kLeiner_HobBes Geschrieben 28. September 2004 Teilen Geschrieben 28. September 2004 Stimmt alles. Ich würd in der eckigen Klammer allerdings noch A-Z hinzufügen, höchstens, du möchtest, daß nur kleingeschriebene Dateien genommen werden. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TinTin Geschrieben 28. September 2004 Autor Teilen Geschrieben 28. September 2004 ...Ich würd in der eckigen Klammer allerdings noch A-Z hinzufügen, höchstens, du möchtest, daß nur kleingeschriebene Dateien genommen werden. oh, ich dachte das erledigt das '/i', danke... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
DevilDawn Geschrieben 28. September 2004 Teilen Geschrieben 28. September 2004 @devilDawn: Die POSIX-Funktionen sind allerdings langsamer. Und das Fragezeichen bedeutet in meinem Fall nicht mindestens eins davon, sondern wieviel er "fressen" soll: http://www.php-faq.de/q/q-regexp-gierig.html Ich nutze PHP seit PHP3, da gabs neumodischen Krams wie PCRE noch nicht Alles Gewohnheit, auf der Shell hast du normal auch nur POSIX RE zur verfügung Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kLeiner_HobBes Geschrieben 28. September 2004 Teilen Geschrieben 28. September 2004 Ich nutze PHP seit PHP3, da gabs neumodischen Krams wie PCRE noch nicht Alles Gewohnheit, auf der Shell hast du normal auch nur POSIX RE zur verfügung Das stimmt allerdings! Benutze Regex halt vor allem in PHP, Shell eher selten. Manchmal auch in C++ oder C#. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TinTin Geschrieben 4. Oktober 2004 Autor Teilen Geschrieben 4. Oktober 2004 hi, ich bins wieder ... kurze frage: ich will über prüfen ob eine datei '.', '..' oder '.*' ist. ich versuche es mit '/^\.*/'. -> funktioniert jetzt will ich prüfen das sie es NICHT ist. wie muss ich die RegEx ändern? wennich einfach '!/^\.*/' gibt er mir nen fehlenden Delimiter an, '!/^\.*/!' bringt zwar keinen fehler aber auch kein ergebnis, genau so wenig wie '/^!\.*/'. :confused: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kills Geschrieben 4. Oktober 2004 Teilen Geschrieben 4. Oktober 2004 oh, ich dachte das erledigt das '/i', danke... der Meinung bin ich auch! ich will über prüfen ob eine datei '.', '..' oder '.*' ist. ich versuche es mit '/^\.*/'. -> funktioniert jetzt will ich prüfen das sie es NICHT ist. wie muss ich die RegEx ändern? wennich einfach '!/^\.*/' gibt er mir nen fehlenden Delimiter an, '!/^\.*/!' bringt zwar keinen fehler aber auch kein ergebnis, genau so wenig wie '/^!\.*/'. :confused: Wie ist denn eine Datei wenn sie weder '.' noch '..' noch '.*' ist? Welche form gibts noch? wieso nimmst du nicht ganz normalen String funktionen, anstatt von RegEx. Die sind auch performanter, natürlich auch weniger umfangreich. if ( $file == '.') { // . } else if ( $file == '..') { // .. } else { // .* } [/PHP] Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TinTin Geschrieben 4. Oktober 2004 Autor Teilen Geschrieben 4. Oktober 2004 Wie ist denn eine Datei wenn sie weder '.' noch '..' noch '.*' ist? Welche form gibts noch? es könnte z.b. eine versteckte datei/verzeichnis unter linux/unix sein. '.htaccess' ist ein gutes beispiel. daher wäre es super das alles in eine RegEx zu überprüfen. ich bekomme es aber einfach nicht hin das '/^\.*/' zu negieren. ciao TinTin Nachtrag: ich sollte eventuell mal genau beschreiben was ich vorhabe: ich will in einem aufwasch ein verzeichnis durchsuchen und alles was nicht '.', '..' und '.xyz123' ist in ein array schreiben. while (false !== ($found = readdir($hd))) if ($found soll nicht '.', '..' oder '.xyz123' sein) { $array[] = $found; }[/PHP] $found soll also die drei kriterien nicht erfüllen und daher habe ich mir gedacht, ich nehme preg_match(), es sei den es gibt einen besseren weg. ciao TinTin Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
DevilDawn Geschrieben 4. Oktober 2004 Teilen Geschrieben 4. Oktober 2004 ich will in einem aufwasch ein verzeichnis durchsuchen und alles was nicht '.', '..' und '.xyz123' ist in ein array schreiben. while (false !== ($found = readdir($hd))) if ($found soll nicht '.', '..' oder '.xyz123' sein) { $array[] = $found; }[/PHP] $found soll also die drei kriterien nicht erfüllen und daher habe ich mir gedacht, ich nehme preg_match(), es sei den es gibt einen besseren weg. Du Formulierst zu umständlich. Im Grunde willst du alles was nicht mit '.' Anfängt in ein Array schreiben. '.' und '..' sind lediglich Sonderfälle. Ausser du willst '..xyz123' erfassen, dann habe ich natürlich unrecht. Insofern reicht die simple Prüfung ob der erste Char von $found ungleich '.' ist. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TinTin Geschrieben 5. Oktober 2004 Autor Teilen Geschrieben 5. Oktober 2004 Du Formulierst zu umständlich. Im Grunde willst du alles was nicht mit '.' Anfängt in ein Array schreiben. '.' und '..' sind lediglich Sonderfälle. Ausser du willst '..xyz123' erfassen, dann habe ich natürlich unrecht. Insofern reicht die simple Prüfung ob der erste Char von $found ungleich '.' ist. Du hast ja so recht. manchmal sin sachen zu einfach ... if (strpos("test", ".")!= 0 || strpos("test", ".") == NULL) aber ich hab es immer noch nicht geschaft die RegEx zu verneinen. kann man das eigentlich, ein perg_match() der nicht einem bestimmten muster entspricht oder stell ich mich zu doof an. Ciao TinTin Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kills Geschrieben 5. Oktober 2004 Teilen Geschrieben 5. Oktober 2004 if (strpos("test", ".")!= 0 || strpos("test", ".") == NULL) mach hier besser so: $aFiles = array(); while (false !== ($found = readdir($hd))) { if ($file{0} == '.' || $file == '..') continue; $aFiles[] = $file; } [/PHP] Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TinTin Geschrieben 6. Oktober 2004 Autor Teilen Geschrieben 6. Oktober 2004 mach hier besser so: $aFiles = array(); while (false !== ($found = readdir($hd))) { if ($file{0} == '.' || $file == '..') continue; $aFiles[] = $file; } [/PHP] Schöne elegante Lösung, danke für den Tip. aber was ich eigentlich immer noch nicht heraus gefunden habe ist folgendes: mache ich ein [b]preg_match('/^\.*/',$string,$match)[/b] finde ich alle die dem ausdruck entsprechen. was muss ich tun, damit [b]preg_match()[/b] die findet, die dem ausdruck [b]nicht[/b] entsprechen. Also, die !(/^\.*/) sind. grazie TinTin Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
DevilDawn Geschrieben 6. Oktober 2004 Teilen Geschrieben 6. Oktober 2004 was muss ich tun, damit preg_match() die findet, die dem ausdruck nicht entsprechen. Also, die !(/^\.*/) sind. Schätzungsweise preg_match('/^[^\.].*/',...) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.