Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

glob() funkktion läuft nur einmal durch

0 views
Skip to first unread message

Michael Prochnow

unread,
Feb 3, 2010, 1:55:49 PM2/3/10
to
Hallo Ng,

ich bin ein bisschen am verzweifeln, hier also meine Ausgangssituation,
ich habe ca 2000 Bilddaten in einem Verzeichniss.
Die Dateinamen der Bilddaten haben ein bestimmtes Muster, ihnen ist Zu
anfang ist ein Autokenzeichen und dann ein Suffix welches am Ende eine
fortlaufende Zahl enthᅵlt.

Es exestieren dazu folgende 5 Datein im Verz foo. (es kᅵnnten aber auch
10 oder 18 oder x-Belibig viel sein...
XX-XX123sufix1.jpg, XX-XX123sufix2.jpg ... XX-XX123sufix5.jpg

Mit folgenden script wolte ich diese ausgeben:
<?php
/*Datei ausgabe.php */
$kenz="XX-XX123";
$path="foo/";
$pattern=$path.$kenz."*";
/* mit dem Sternchen sollten doch alle Sufixe erkannt und ausgeben
werden abgegolten sein, oder? */
foreach( glob($pattern,GLOB_NOCHECK) as $filename) {
echo <<< BILD
<p><img name="fahrzeugschein" src="$filename /></p>
BILD;
}

?>
Anzeige: *nur Datei XX-XX123sufix1.jpg*
Dei anderen werde nicht mehr angezeigt!
Was mache ich falsch?
Ich freue mich ᅵber Rᅵckmeldungen.
M. Prochnow

Andreas Hecht

unread,
Feb 3, 2010, 2:09:12 PM2/3/10
to
Am 03.02.2010 19:55, schrieb Michael Prochnow:

> <p><img name="fahrzeugschein" src="$filename /></p>

Da fehlt was: ^

Ansonsten: Wie groᅵ ist denn das von glob zurᅵckgegebene Array?


mfg,
Andreas

Michael Prochnow

unread,
Feb 4, 2010, 2:34:44 AM2/4/10
to
Andreas Hecht schrieb:

> Am 03.02.2010 19:55, schrieb Michael Prochnow:
>
>> <p><img name="fahrzeugschein" src="$filename" /></p>
> Da fehlt was:
^
Danke, ist aber nur im Posting rausgerutscht...

>
> Ansonsten: Wie groᅵ ist denn das von glob zurᅵckgegebene Array?
naja da foreach nur einmal druchlᅵuft findet er nur ein teil,
es sollte aber in meinem konkreten Beispiel, die werte 0-4 bekommen
also #eigentlich 5 Werte#
Ich ᅵberprᅵf das gleich nochmal genauer.
trotzdem ist doch die "eigntliche" foreach (glob($patern ) as
$filename){...}
richtig oder?
Der Witz es hat schon mal so funktioniert und eine Suche mit
Totalcomander im Verzeichniss mit XX-XX123*.* findet auch die 5 Dateien...
Noch Tipps, bin fᅵr jede dektetivische Spur dankbar!
>
>
> mfg,
> Andreas

Michael Prochnow

unread,
Feb 4, 2010, 3:28:50 AM2/4/10
to
Michael Prochnow schrieb:

> Andreas Hecht schrieb:
>> Am 03.02.2010 19:55, schrieb Michael Prochnow:
>>
>>> <p><img name="fahrzeugschein" src="$filename" /></p>
>> Da fehlt was:
> ^
> Danke, ist aber nur im Posting rausgerutscht...
>>
>> Ansonsten: Wie groᅵ ist denn das von glob zurᅵckgegebene Array?
in diesenm Beispiel 1
Das Problem habe ich eingekreist,
obwohl es sich um ein Windows system handelt, schein glob case sensitive
zu arbeiten. Enn die Dateinamen sind mal mit groᅵbuchstaben und mal mir
kleinbuchstaben. Wie bekomme ich das nun hin, dass, egal wie die
Dateinamen sind also, ob groᅵ oder klein, ich immer das richtige Muster
an glob() ᅵbergebe. Welche funktionen sollte ich nehmen?
Ich weiᅵ ja nie, ob der Dateiname mit groᅵ oder klein buchstaben
geschrieben ist.

Ulf [Kado] Kadner

unread,
Feb 4, 2010, 3:42:24 AM2/4/10
to
On Wed, 03 Feb 2010 19:55:49 +0100, Michael Prochnow wrote:

> Es exestieren dazu folgende 5 Datein im Verz foo. (es k�nnten aber auch

> 10 oder 18 oder x-Belibig viel sein...
> XX-XX123sufix1.jpg, XX-XX123sufix2.jpg ... XX-XX123sufix5.jpg
>
> Mit folgenden script wolte ich diese ausgeben:

> $kenz="XX-XX123";
> $path="foo/";
> $pattern=$path.$kenz."*";
> /* mit dem Sternchen sollten doch alle Sufixe erkannt und ausgeben
> werden abgegolten sein, oder? */
> foreach( glob($pattern,GLOB_NOCHECK) as $filename) {
> echo <<< BILD
> <p><img name="fahrzeugschein" src="$filename /></p>
> BILD;
> }

Ich hab mal Deinen Code genommen und zu testzwecken laufen lassen.
Funktioniert hier eigentlich problemlos und gibt das aus was erwartet
wird. L�uft hier auf Windows sowie auf Linux gut durch.

Einziger Unterschied ist, das ich einen absoluten Pfad nutze
$path = dirname(__FILE__) . '/foo/'; der dann wieder zur�ck gewandelt
werden muss. Das liegt aber bei mir daran, das ich Prinzipiell nur abs.
Pfade nutze.

Ist denn Sichergestellt, das Du auf alle genutzten Dateien/Verzeichnisse
Lesezugriff hast?

Ein Problem wird auch auftauchen, wenn Du keine Treffer hast und durch
GLOB_NOCHECK einfach das Pattern zur�ck gegeben wird. Das must Du mit
abpr�fen. Alternativ auch mal mit GLOB_ERR nutzen

Wenn Du hier nicht weiter kommst dann iteriere mal zu testzwecken einfach
ohne glob durch die Dateien um zu sehen obs da unterschiede gibt

$path = dirname(__FILE__) . '/foo';
$pattern = 'XX-XX123*';
$d = dir( $path );
$d->read(); $d->read();
while ( FALSE !== ( $item = $d->read() ) )
{
if ( !fnmatch( $pattern, $item ) ) continue;
echo "{$item}\n";
}
$d->close();

Damit sollte eigentlich alles n�tige angezeigt werden.

MfG, Ulf

Ulf [Kado] Kadner

unread,
Feb 4, 2010, 4:17:43 AM2/4/10
to
On Thu, 04 Feb 2010 09:28:50 +0100, Michael Prochnow wrote:

> Das Problem habe ich eingekreist,
> obwohl es sich um ein Windows system handelt, schein glob case sensitive

> zu arbeiten. Enn die Dateinamen sind mal mit gro�buchstaben und mal mir

> kleinbuchstaben. Wie bekomme ich das nun hin, dass, egal wie die

> Dateinamen sind also, ob gro� oder klein, ich immer das richtige Muster
> an glob() �bergebe.

Mit glob garnicht. Habs gerad mal getestet. Das Verhalten von glob kann
man hier diesbez�glich durchaus als Bug bezeichnen. Entweder es findet
ausschlie�lich Treffer die der Gro�-Kleinschreibung entsprechen oder
halt nicht. Das hier ein einzelner Treffer ausgegeben wird, der nicht mal
der strikten Gross-Kleinschreibung entspricht, aber dann nichts weiter
w�rde ich als Bug bezeichnen. Habs gerad mal hier auf mindows
durchgespielt. Kannste ja auf bugs.php.net als Bug melden. Aber vorher
schauen obs dazu nicht bereits eine Meldung gibt!

> Welche funktionen sollte ich nehmen?

Da bleibt Dir nur das simple iterieren durch die Dateien wie in meinem
Beispiel und analyse mit Regex, oder fnmatch

$pattern = '~XX-YY123.+~i';
$path = dirname(__FILE__) . '/Test/';


$d = dir( $path );
$d->read(); $d->read();
while ( FALSE !== ( $item = $d->read() ) )
{

if (!preg_match($pattern,$item)) continue;


echo "{$item}\n";
}
$d->close();

> Ich wei� ja nie, ob der Dateiname mit gro� oder klein buchstaben
> geschrieben ist.

Alternativ kannst Du aber durch die Dateinamen iterieren und diese im
entscheidenten Teil in Gro�- oder Kleinschreibung umwandeln, dann kann
auch dannach glob genutzt werden. Dannach halt nur noch Dateien einf�gen,
die der bevorzugten Schreibweise entsprechen.

MfG, Ulf

Claus Reibenstein

unread,
Feb 4, 2010, 4:46:00 AM2/4/10
to
Michael Prochnow schrieb:

> Andreas Hecht schrieb:
>
>> Am 03.02.2010 19:55, schrieb Michael Prochnow:
>>
>>> <p><img name="fahrzeugschein" src="$filename" /></p>
>>
>> Da fehlt was:
> ^
> Danke, ist aber nur im Posting rausgerutscht...

Dafᅵr gehᅵrt Du geschlagen, und das gleich zweimal:
- Du hast Programmcode abgetippt, anstatt ihn per Copy&Paste aus dem
Original in die Nachricht zu ᅵbertragen.
- Du fᅵlschst Zitate.

Gruᅵ. Claus

Carsten Wiedmann

unread,
Feb 4, 2010, 4:57:32 AM2/4/10
to
Am 04.02.2010 09:28, schrieb Michael Prochnow:
>>>> foreach( glob($pattern,GLOB_NOCHECK) as $filename) {
>>>> echo <<< BILD
>>>> <p><img name="fahrzeugschein" src="$filename /></p>
>>>> BILD;

>>>> }
> Das Problem habe ich eingekreist,
> obwohl es sich um ein Windows system handelt, schein glob case sensitive
> zu arbeiten. Enn die Dateinamen sind mal mit großbuchstaben und mal mir

> kleinbuchstaben. Wie bekomme ich das nun hin, dass, egal wie die
> Dateinamen sind also, ob groß oder klein, ich immer das richtige Muster
> an glob() übergebe. Welche funktionen sollte ich nehmen?

Also wenn ich schon weis, dass ich das auf einem Windows Server mach, dann
nehm ich für sowas immer DIR, dass bietet mir da mehr als glob (und wenn
man's dann auch noch mit Unverzeichnisse machen würde, um Längen schneller,
als alles was PHP da bietet...)

z.B.:
|<?php
| $kenz = 'XX-XX123';
| $path = 'foo/';
|
| $pattern = str_replace('/', '\\', $path).$kenz.'*';
| exec("DIR /B \"{$pattern}\"", $filename);
|
| foreach($filename as $value) {
| echo "<p><img name='fahrzeugschein' src='{$path}{$value}' /></p>";
| }
| ?>

Gruß
Carsten

Michael Prochnow

unread,
Feb 4, 2010, 5:42:20 AM2/4/10
to
Claus Reibenstein schrieb:

... ich bᅵser ich, also Gnade? Bekommste dann auch beim nᅵchsten mal...
wenn nicht, denke dran was wir sᅵen ernten wir... ;-)

>
> Gruᅵ. Claus

Gruᅵ Micha

Knut Kohl

unread,
Feb 4, 2010, 3:51:34 PM2/4/10
to
Hallo,

Michael Prochnow schrieb am 03.02.2010 in de.comp.lang.php.misc:

Wenns denn glob() sein soll, versuch mal folgendes (ungetestet)

> <?php
> /*Datei ausgabe.php */
> $kenz="XX-XX123";

$kennz = '{X,x}{X,x}-{X,x}{X,x}123';

> $path="foo/";
> $pattern=$path.$kenz."*";

$pattern=$path.$kennz."*";

> /* mit dem Sternchen sollten doch alle Sufixe erkannt und ausgeben
> werden abgegolten sein, oder? */
> foreach( glob($pattern,GLOB_NOCHECK) as $filename) {

foreach( glob($pattern,GLOB_BRACE) as $filename) {

> echo <<< BILD
> <p><img name="fahrzeugschein" src="$filename /></p>
> BILD;
> }

Wobei ich mich meinen Vorrednern anschlie�en m�chte, wenn die
Verzeichnisstruktur nicht zu tief ist, mit dir(), is_dir() und
preg_match() zu arbeiten...

Regards,
Knut

--
http://es-f.com
Web frontend for esniper, the console application for sniping eBay auctions.

Christian Winter

unread,
Feb 4, 2010, 4:04:02 PM2/4/10
to
Michael Prochnow schrieb:

> Das Problem habe ich eingekreist,
> obwohl es sich um ein Windows system handelt, schein glob case sensitive
> zu arbeiten. Enn die Dateinamen sind mal mit groᅵbuchstaben und mal mir
> kleinbuchstaben. Wie bekomme ich das nun hin, dass, egal wie die
> Dateinamen sind also, ob groᅵ oder klein, ich immer das richtige Muster
> an glob() ᅵbergebe. Welche funktionen sollte ich nehmen?
> Ich weiᅵ ja nie, ob der Dateiname mit groᅵ oder klein buchstaben
> geschrieben ist.

File::DosGlob?

-Christian

Ulf [Kado] Kadner

unread,
Feb 5, 2010, 4:21:10 AM2/5/10
to
On Thu, 04 Feb 2010 21:51:34 +0100, Knut Kohl wrote:

> $kennz = '{X,x}{X,x}-{X,x}{X,x}123';

Gute Idee! Das k�nnte man auch entsprechend automatisieren:

function str_to_nocasebraces($str)
{
$output = '';
for ( $i = 0; $i < strlen($str); ++$i )
{
if ( !ctype_alpha( $str[$i] ) )
{
$output .= $str[$i];
continue;
}
$output .= '{' . strtoupper($str[$i]) . ',' .
strtolower($str[$i]) . '}';
}
return $output;
}

MfG, Ulf

Michael Prochnow

unread,
Feb 5, 2010, 1:35:52 PM2/5/10
to
Ulf [Kado] Kadner schrieb:
Danke das hat geklappt, ich mu�te ja die Funktion jezt nur noch testen
und anpassen und das hat einen Tag gedauert, also ich habe es dann auch
mit dir() und preg_match gemacht, blitzschnell! es sind knapp 4000
Dateien im Verzeichniss aus denen hat er die 5 Treffer in 0,nix raus
gefunden cool...!
hier mal der etwas angpasste Code von mir:
$path= '/foo';
$kenz="'XX-XX123";
$pattern="~".$kenz."an[0-9]+.*~i";

$d = dir( $path );
while ( FALSE !== ( $file= $d->read() ) ) {
if ($file== "." or $file == "..") continue; /* bin mir nicht ganz sicher
ob das muss, wird ja eingetlich durch preg_match weggefiltert, oder? */
if ( !preg_match( $pattern, $item ) ) continue;
//... noch a biser'l code...
echo "$item <br />";
}
$d->close();

Ulf Kadner

unread,
Feb 5, 2010, 1:57:39 PM2/5/10
to
On Fri, 05 Feb 2010 19:35:52 +0100, Michael Prochnow wrote:

> if ($file== "." or $file == "..") continue;

Diese Bedingung ist unn�tig! Mach einfach das:

$d->read(); $d->read();

vor das schleife wieder rein.

'.' und '..' sind immer die ersten Beiden.

Aber ich denke das Du mit dem Vorschlag von Knut und meiner dazu
geposteten Funktion zu Anlegen des n�tigen Formats schneller kommst.

Auf Meiner Maschine ists jedenfalls so.

MfG, Ulf

0 new messages