Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Empfohlene Antworten

Veröffentlicht

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

Schau mal hier: http://php-faq.de/q/q-regexp-bauelemente.html

Deine Regex sollte IMHO so aussehen: /tb_.*?\.jpg/i

Ungetestet

versuch doch


if ( strpos( $file, "jpg) !== false) {
}
[/PHP]

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

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

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

@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

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

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.

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

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

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

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:

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]

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

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.

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

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]

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

was muss ich tun, damit preg_match() die findet, die dem ausdruck nicht entsprechen. Also, die !(/^\.*/) sind.

Schätzungsweise preg_match('/^[^\.].*/',...)

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.