Zum Inhalt springen

brauche hilfe bei regulären ausdrücken ...


TinTin

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

@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 :D

Alles Gewohnheit, auf der Shell hast du normal auch nur POSIX RE zur verfügung :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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:

Link zu diesem Kommentar
Auf anderen Seiten teilen

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]

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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