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
> <p><img name="fahrzeugschein" src="$filename /></p>
Da fehlt was: ^
Ansonsten: Wie groᅵ ist denn das von glob zurᅵckgegebene Array?
mfg,
Andreas
> 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
> 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
> 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
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
... 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
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.
File::DosGlob?
-Christian
> $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
> 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