phpbar.de logo

Mailinglisten-Archive

[php] Nur die nächste Datei im Verzeichnis verlinken - Wie?

[php] Nur die nächste Datei im Verzeichnis verlinken - Wie?

Yannik Hampe yannik at cipher-code.de
Don Nov 8 17:05:23 CET 2007



Kirsten Bohlig wrote:
> Hallo,
> 
> vorab:  das ist meine erste Mail in diese Liste,
> ich heiße Kirsten, komme aus Karlsruhe, habe bislang nur eher statische 
> Websites erstellt und versuche mich ohne großartige 
> Programmiervorkenntnisse in php einzuarbeiten.

Jeder von uns hat mal angefangen :-).
> 
> Ich stoße dabei öfter an meine Grenzen, da ich die Sprache nicht 
> beherrsche, das Vokabular nicht vorrätig habe. Das bedeutet: ich 
> versuche eher nur, vorhandene Skripte an meine Wünsche anzupassen, ohne 
> - ehrlich gesagt - bei jedem Schritt wirklich zu verstehen, was da alles 
> vor sich geht... (was ich aber zu gerne möchte und versuche ;-)

kann man natürlich machen. Aber sei vorsichtig: Es gibt wirklich sooo 
viele "schlechte" Scripte (lies schlecht wie in unsicher, langsam, 
unleserlich) da draussen, dass du als Anfängerin dir unnötig viel arbeit 
machst und dir den Risiken nicht bewusst bist.
> 
> Also:
> Mit folgendem Code lese ich die Dateien aus einem Verzeichnis aus, 
> filtere die php-Dateien aus und verlinke sie mit ihren jeweiligen 
> h1-Überschriften als Linktext.
> 
> $dir = "OrdnerXY"; // Verzeichnisname
> $verzeichnis = openDir($dir);
> while ($file = readDir($verzeichnis))
> { 	
>   	if($file != substr_count($file,".php"))
> 		{
> 		  $datei = fOpen($dir . "/" . $file, "r");
> 		  $inhalt = fRead($datei, 1000);
> 		  fClose($datei);
> 		  ereg("<h1>(.*)<\/h1>" , $inhalt , $extract);
> 		  $content .= "<a href=\"".$dir."/" .$file . "\">$extract[1]</a>";
> 		}
> }
> closeDir($verzeichnis);

Was mir auffällt: Wie ich selbst demletzt gelernt habe ist php 
"case-insensitiv". Also d.h. php ignoriert Groß- und Kleinschreibung. 
Zumindest bei den meisten Sachen. Bei manchen anderen Dingen (zum 
Beispiel Variabelnamen) zählt die Groß- und Kleinschreibung. Ich rate 
dir jedenfalls dazu dich nicht darauf zu verlassen, dass php eine Groß-/ 
Kleinschreibweise ignoeriert, bzw. dass dies in der Zukunft so bleiben 
wird. Die von dir verwendeten Funktionen opendir, fopen, fread,... 
werden "eigentlich" alle kleingeschrieben.

Dann mal das spezifische:
if($file != substr_count($file,".php"))
Du zählst, wie oft der String ".php" im aktuellen Datainame vorkommt. 
Ist diese Zahl nicht gleichzeitig der Dateiname, dann ist die 
if-Bedingung true und du gehst in der folgendem Block rein.
Ausser wenn dein aktueller Dateiname mit einer 0 anfängt und der 
Dateiname .php nicht enthält, ist diese Bedingung immer wahr. 
Php-Dateien filterst du damit nicht raus. Besser wäre wohl
if (substr_compare($file, ".php", -4, 4, true) ==0)
{
   ...
}
So prüfst du, ob der Dateiname ohne Beachtung von Groß- und 
Kleinschreibung auf .php endet.

$inhalt = fRead($datei, 1000);
Du liest dir also einfach die ersten 1000 Bytes der Datei ein. Reicht 
dir das? Du kannst mit file_get_contents() auch die ganze Datei 
einlesen. Das wäre zwar auch noch optimierungsfähig, aber ich will dir 
ja nicht gleich zu viel an den Kopf werfen, wenn ich schon an jeder 
Zeile was auszusetzen habe ^^.

ereg("<h1>(.*)<\/h1>" , $inhalt , $extract);
Beachte den Hinweis in der Referenz:
Note: preg_match(), which uses a Perl-compatible regular expression 
syntax, is often a faster alternative to ereg().
Hinzu kommt noch mein Hinweis, dass man regexe vermeiden sollte, wenn es 
auch (einfach) ohne geht. Beispiel einer anderen Lösung:
$titelpos =strpos($inhalt,'<h1>'); //erstmal schauen wir, wo das erste 
<h1> vorkommt
$titel =substr($inhalt, $titelpos+4, 
strpos($inhalt,'</h1>',$titelpos)-4-$titelpos); //und dann holen wir uns 
den Substring raus

$content .= "<a href=\"".$dir."/" .$file . "\">$extract[1]</a>";
Vorsicht! Stell dir vor $dir = 'bla"blubb'; Also hat ein " mittendrin. 
Das würde dir alles kaputt machen. Oder $extract[1] hat ein "</a>" drin. 
Ist zwar unwahrscheinlich, aber du musst diese Zeichen ersetzen:
$content .= "<a href=\"".urlrawencode($dir."/" 
.$file)."\">htmlspecialchars($extract[1])</a>";
Das habe ich jetzt zwar so aus dem Kopf geschrieben, aber sollte klappen.
> 
> Ich bekomme es auch hin, mir nur die "neueste Datei" verlinkt anzeigen 
> zu lassen, das Verzeichnis rauf und runter zu sortieren usw.
> 
> Mein Problem:
> Ruft man eine dieser Dateien aus der Liste auf, kommt man auf eine 
> "Folgeseite".
> Jetzt hätte ich gerne, dass auf dieser "zweiten" Seite nur *ein* Link 
> angezeigt wird, nämlich der auf die Datei, die als nächstes im 
> Verzeichnis aufgelistet ist, ein eigentlich doch schlichter 
> "Weiter"-Link also.

Übergib doch im Link einfach die aktuelle Datei... Zum beispiel
<a href="getnext.php?aktuell=aktuelleDatei.php">Nächste Datei</a>
Dann kannst du vor deiner while Schleife noch folgendes Ergänzen:
while ($file = readDir($verzeichnis) && $file !=$_REQUEST['aktuell']) ; 
//überspringt einfach alle Dateien, bis zu der Datei, die in aktuell=xxx 
übergeben wurde.
if($file = readDir($verzeichnis)) //das ist dann die folgende Datei.
{
   //hier die entsprechende Datei behandeln
}
Ich hoffe dir ist so grundsätzlich klar, was ich da machen würde. Ich 
habe sonst keine Bedenken wieder von dir zu höhren :-D.

> Vielen Dank für Tipps!
> 
> Grüße
> Kirsten

Yannik

php::bar PHP Wiki   -   Listenarchive