Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben

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

Geschrieben

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

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

Geschrieben

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

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

Geschrieben
Ich nutze PHP seit PHP3, da gabs neumodischen Krams wie PCRE noch nicht :D

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

Geschrieben

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:

Geschrieben
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]

Geschrieben

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

Geschrieben

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.

Geschrieben
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

Geschrieben
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]

Geschrieben
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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...