JulianBaumueller: Dateien aus Verzeichnis (OHNE ENDUNG) anzeigen

Hallo,

ich hab mal wieder für euch wahrscheinlich was einfach zu Fragen:

Ich will einen Inhalt aus einem Verzeichnis anzeigen.
Doch nun sollen die Dateien, die angezeigt werden, ohne endung (also ohne ".htm" or ".php" or ".txt" usw.) angezeigt werden...

kann mir irgendjemand weiterhelfen?

Hier dass Script, dass ich benutze, um den Inhalt des Verzeichnisses anzuzeigen:

  
  
<?php  
$verzeichnis = "."; // Name des Verzeichnises  
$action=opendir($verzeichnis);  
  
while($datei=readdir($action)){  
if(!preg_match("!(\.|\..)$!", $datei)){  
?>  
<a href="<?=$verzeichnis.'/'.$datei.' ?>"><?=$datei ?></a><br>  
<?php  
}  
}  
?>  
  

Hoffe auf schnelle Antworten.
Greez, Julian.

  1. Hi,

    Ich will einen Inhalt aus einem Verzeichnis anzeigen.
    Doch nun sollen die Dateien, die angezeigt werden, ohne endung (also ohne ".htm" or ".php" or ".txt" usw.) angezeigt werden...

    kann mir irgendjemand weiterhelfen?

    Ja - das Handbuch.
    http://www.php.net/manual/en/ref.filesystem.php

    MfG ChrisB

    --
    “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
    1. Lieber ChrisB,

      ich schätze Deine Antworten hier schon immer sehr.

      Doch nun sollen die Dateien, die angezeigt werden, ohne endung (also ohne ".htm" or ".php" or ".txt" usw.) angezeigt werden...
      [...]
      Ja - das Handbuch.
      http://www.php.net/manual/en/ref.filesystem.php

      Diese war jedoch nicht zielführend, da Du wohl die Aufgabenstellung nicht genau genug gelesen hast... und damit ebenso sparsam warst, wie Du es implizit dem OP nahegelegt hast.

      Liebe Grüße,

      Felix Riesterer.

      --
      ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
      1. Hi,

        Doch nun sollen die Dateien, die angezeigt werden, ohne endung (also ohne ".htm" or ".php" or ".txt" usw.) angezeigt werden...
        [...]
        Ja - das Handbuch.
        http://www.php.net/manual/en/ref.filesystem.php

        Diese war jedoch nicht zielführend, da Du wohl die Aufgabenstellung nicht genau genug gelesen hast...

        Oder du (ebenfalls) das Manual nicht aufmerksam.

        Direkt die erste dort genannte Funktion, basename, verlinkt auch gleich zu pathinfo.

        MfG ChrisB

        --
        “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
        1. Hi,

          Direkt die erste dort genannte Funktion, basename, verlinkt auch gleich zu pathinfo.

          Mit dem Testbeispiel, das das Folgende ausgibt:
          /www/htdocs
          index.html
          html

          basename enthält immer noch die Dateiendung, und genau die wollte der OP loswerden.

          Gruesse, Joachim

          --
          Am Ende wird alles gut.
          1. Lieber Joachim,

            Direkt die erste dort genannte Funktion, basename, verlinkt auch gleich zu pathinfo.
            Mit dem Testbeispiel, das das Folgende ausgibt:
            /www/htdocs
            index.html
            html

            basename enthält immer noch die Dateiendung, und genau die wollte der OP loswerden.

            Du solltest schon das gesamte Code-Snippet besprechen, denn sonst ist Deine Schlussfolgerung falsch.

            Das Testbeispiel lautet: ~~~php <?php
            $path_parts = pathinfo('/www/htdocs/index.html');

            echo $path_parts['dirname'], "\n";
            echo $path_parts['basename'], "\n";
            echo $path_parts['extension'], "\n";
            echo $path_parts['filename'], "\n"; // since PHP 5.2.0
            ?>

              
            Wie man sehr schön sehen kann, müsste der OP lediglich die gewünschten Indices zu einem String (zurück)verketten, um seinen Pfad ohne Endung zu erhalten. An den reinen Dateinamen kommt er auf diesem Weg allerdings erst, wenn er PHP5.2.0 einsetzt! (ChrisB, hier sehe ich ein mögliches kleines Problem, falls der Hoster nicht mitspielt.)  
              
            ~~~php
            $dateipfad = '/www/htdocs/index.html';  
            $pfadbestandteile = pathinfo($dateipfad);  
            $dateiname = $pfadbestandteile['filename']; // geht erst ab PHP5.2.0!  
            $pfad_zur_datei = $pfadbestandteile['dirname'];  
            $dateiendung = $pfadbestandteile['extension'];  
              
            echo "Dateiname:     '$dateiname'\r\n",  
                "Dateiendung:    '$dateiendung'\r\n",  
                "Pfad zur Datei: '$pfad_zur_datei'\r\n",  
                "Gesamter Pfad:  '$pfad_zur_datei/$dateiname.$dateiendung'\r\n",  
                "(Originalpfad:  '$dateipfad')\r\n";
            

            Liebe Grüße,

            Felix Riesterer.

            --
            ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
            1. Hallo,

              ich hab grade das eine posting (fast wieder dass erste) gelesen und festgestellt dass es sich da wieder um die selbe frage wie hier handelt.

              Weil sich da aber niemand mit dran hängen will, frag ich euch mal ob es eine Schleife gibt, die den letzten Punkt in einer per PHP ausgelesenen Datei entfernen oder ausblenden kann...

              Greez Julian.

              1. Hi,

                ich hab grade das eine posting (fast wieder dass erste) gelesen und festgestellt dass es sich da wieder um die selbe frage wie hier handelt.

                Das wird vermutlich daran liegen, dass du diese Frage, auf die du dich beziehst, ebenfalls selber gestellt hast.

                Lies bitte </hilfe/charta.htm#verhaltensrichtlinien> (was den Punkt Sockenpuppen angeht), und </hilfe/charta.htm#keine-doppelpostings>

                Und dann erkläre uns bitte, warum du jetzt wieder nach einer anderen Lösung für dein ursprüngliches Problem suchst.
                Was an den Hinweisen, die du bisher erhalten hast, war denn nicht zielführend?

                MfG ChrisB

                --
                “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
                1. Ich hab dass gemacht weil ich mit dieser ganzen pathinfo()-geschichte nich zurecht gekommen bin und mir vorgekommen bin als würde mein posting völlig an bedeutung verlieren und alle völlig vom thema abkommen würden.

                  Dann ist mir dass mit dieser Schleife zuohren gekommen...

                  Warum ich dass mit dem anderen Namen gemacht weiß ich auch nich so genau...

                  Also entschuldige ich mich hiermit für mein ungeschicktes und nicht erlaubtes Doppelposting bei allen SELFHTML-Usern.

                  Grüße
                  Julian.

              2. Hello Julian,

                [...] ob es eine Schleife gibt, die den letzten Punkt in einer per PHP ausgelesenen Datei entfernen oder ausblenden kann...

                Jetzt bitte mal Butter bei die Fische und ganz exakt antworten:
                Möchtest Du IN einer Datei etwas ändern?
                Oder möchtest Du den Namen der Datei, bzw. den angezeigten Namen ändern, so wie das oben schon angedeutet wurde?

                Ich nehme jetzt mal an, dass Du den angezeigten Namen ändern willst, also die Extension, weglassen willst. Da sind gestern einige Fragen und Tipps offen geblieben.

                1. Trenne Datenbeschaffung, Datenverarbeitung, Datenspeicherung und Anzeige sauber voneinander.
                   Das hat den Vorteil, dass man wiederbenutzbare Funktionen aus den einzelen Aufgaben machen
                   kann und außerdem eine bessere Struktur in seine Skripte bekommt. Das erhöht die Übersicht-
                   lichkeit und verbessert die Wartbarkeit.

                2. Wenn Du Funktionen benutzt, schaue immer ins Handbuch auf http://php.net, wie diese
                   funktionieren und lies Dir die Beispiele durch. Und besonders zuu empfehlen sind auch die
                   UCN = User Contributed Notes = Bemerkungen und Beispiele der Benutzer

                Zur Vorgehensweise:

                Daten beschaffen. Du brauchst die Dateinamen, dad geht bequem mit der Funktion glob()
                http://de2.php.net/manual/en/function.glob.php
                Du erhältst dann ein Array, das Du anschließend nur durchzuarbeiten brauchst.

                $path = '/home/meine_dateien/';   ## abschließenden Slash beachten!

                $pattern = '*.*'                  ## Alle Dateien mit einer Endung

                $pattern = '*';                   ## Alle Dateien

                $pattern = '*.jpg';               ## Alle Dateien mit der kleingeschriebenen Endung jpg

                $_dir = glob($path.$pattern);

                Wenn Du nur Dateien haben willst, schmeißt Du alle Elemente aus dem Array raus, die KEINE Files kennzeichnen. Das geht mit einer foreach()-Schleife, der Funktion is_file() und der Funktion unset()

                if (is_array($_dir))
                {
                    foreach ($_dir as $key => $path)
                    {
                        if (!is_file($path))
                        {
                            unset ($_dir[$key]);
                        }
                   }
                }

                Wenn Du nun nur die Dateinamen haben möchtest OHNE Endungen, dann musst Du Dir erst einmal die qualifizierten Pfade+Namen ansehen, ob sie überhaupt eine Extension haben. Es muss also mindestens ein Punkt enthalten sein im basename() aus dem Namensstring. Dann kannst Du entweder die Funktion explode('.', $name, -1) benutzen und anschließend die Teile wieder mit implode zusammensetzen, oder Du benutzt die für Pfade gedachte Funktion pathinfo()
                http://de2.php.net/manual/en/function.pathinfo.php,
                Die Dir ja schon genannt wurde von Felix https://forum.selfhtml.org/?t=194374&m=1299595

                $_result = array();  ## Neues Array für das Ergebnis bereitstellen

                if (is_array($_dir))
                {
                    foreach($_dir as $key => $path)
                    {
                        $_result[] = pathinfo($path, PATHINFO_FILENAME);
                    }
                }

                Wenn Du pathinfo() benutzt musst Du entweder mit dem Argument Options arbeiten. Du gibst dann EINE der Möglichkeiten an (PATHINFO_DIRNAME, PATHINFO_BASENAME, PATHINFO_EXTENSION, PATHINFO_FILENAME) und erhältst dann das entsprechende Element als String zurück, oder Du musst vorher mit isset() prüfen, ob das Element überhaupt im Array zurückgegeben wurde, und dann auf das Array-Element zugreifen.

                Am Ende solltest Du ein Array übrig behalten, dass die Informationen in dre gewünschten Form enthält und dann nur noch an Deine Ausgabefunktion übergeben werden muss.

                echo "<pre>\r\n";
                echo htmlspecialchars(print_r($_result,1));
                echo "</pre>\r\n";

                Aus den oben aufgezeigten Sequenzen solltest Du, wenn sie geprüft sind, kleine Funktionen bauen, die immer entweder false oder das gewünschte Ergebnis (hier meistens als Array() zurükgeben. Übergibt man einer solchen Teilfunktion anstelle des erwartetn Typs, sollte diese gelich mit

                return false;

                abbrechen.

                Beispiel, alle Elemente aus dem Array löschen, die KEINE Files sind und
                Links und relative Pfadangaben umwandeln in reale qualifizierte Pfade:

                #------------------------------------------------
                    function only_real_files($_dir)
                    {
                        if (!is_array($_dir)) return false;

                foreach ($_dir as $key => $path)
                        {
                            if (!is_file($path))
                            {
                                unset ($_dir[$key]);            ## Elemente rausschmeißen, die keine Files
                            }                                   ## oder Links darauf kennzeichnen
                            else
                            {
                                $_dir[$key] = realpath($path);  ## Links und relative Pfade auflösen zu
                                                                ## qualifizierten (echten) Pfaden
                            }
                        }

                return $_dir;
                    }
                #------------------------------------------------

                Wenn Du mit allen anderen Programmsequenzen auch so verfährst, entsteht daraus nachher eine brauchbare Funktionssammlung, die Du immer wieder benutzen kannst.

                Liebe Grüße aus dem schönen Oberharz

                Tom vom Berg

                --
                 ☻_
                /▌
                / \ Nur selber lernen macht schlau
                http://bergpost.annerschbarrich.de
        2. Lieber ChrisB,

          Direkt die erste dort genannte Funktion, basename, verlinkt auch gleich zu pathinfo.

          meines Erachtens ist pathinfo eine Stringfunktion und sollte dort auch gelistet werden. Dass sie "spezielle" Strings, nämlich einen URL "parst" und in ein assoziatives Array aufsplittet ist zwar etwas, das man im Kontext von den filesystem functions benötigt, das aber nach wie vor als Parameter einen simplen String (und nicht etwa eine Ressource o.ä.) benötigt und von daher zu den string functions gezählt werden sollte (ja, auch wenn pathinfo ein Array zurück gibt).

          Ich gebe zu, dass ich diese Funktion vorher noch nie (zumindest nicht bewusst) gesehen habe. PHP ist ja eh mit einer schier unüberschaubaren Flut an Funktionen gesegnet (oder verflucht?) - und ich löse String-Probleme am liebsten mit str_- oder preg_-Funktionen, gerade und vor allem in Fällen wie diesem, da das Ergebnis eben auch wieder ein String ist.

          Liebe Grüße,

          Felix Riesterer.

          --
          ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
          1. Hi!

            meines Erachtens ist pathinfo eine Stringfunktion und sollte dort auch gelistet werden.

            Nicht immer ist es sinnvoll, das so streng zu trennen, denn dann müsste man auch implode() zu den Array-Funktionen zuordnen, explode() aber bei den Strings lassen. Auch fopen() gehörte dann zu den String-Funktionen, verarbeitet sie doch auch nur einen String. Funktionen, die sich mit real existierenden oder imaginären Pfaden beschäftigen in Richtung File-I/O einzusortieren, ist schon in Ordnung.

            Lo!

        3. Hallo,

          _________
          @ FelixRiesterer:
          Damit zeigst Du aber auch Verzeichnisse an...
          _________

          Dann könnte ich doch mein Script doch gleich weglassen und gleich dass anwenden, wass du da gepostet hast...

          Greez Julian.

          1. Lieber JulianBaumueller,

            @ FelixRiesterer:
            Damit zeigst Du aber auch Verzeichnisse an...

            Du hast meine Code-Zeile als Komplettlösung missverstanden.

            Liebe Grüße,

            Felix Riesterer.

            --
            ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
  2. Lieber JulianBaumueller,

    Ich will einen Inhalt aus einem Verzeichnis anzeigen.

    das kannst Du anscheinend schon (siehe Dein Code-Beispiel).

    Doch nun sollen die Dateien, die angezeigt werden, ohne endung (also ohne ".htm" or ".php" or ".txt" usw.) angezeigt werden...

    Das löst Du mit einer simplen String-Operation. z.B. so:
    $dateiname = preg_replace('~\.[^.]+$~', '', $dateiname);

    while($datei=readdir($action)){

    if(!preg_match("!(.|..)$!", $datei)){
    ?>
    <a href="<?=$verzeichnis.'/'.$datei.' ?>"><?=$datei ?></a><br>
    <?php
    }
    }
    ?>

      
    Damit zeigst Du aber auch Verzeichnisse an... was in Deiner Aufgabenstellung aber nicht erwähnt wurde. Zudem ist es (für Windows-only-User) verwirrend, wenn sowohl Verzeichnisse, als auch Dateien keine Endungen haben - man sieht sozusagen nur noch Verzeichnisse.  
      
    
    > Hoffe auf schnelle Antworten.  
      
    Bitte nicht drängeln. Das wird hier nicht gerne gesehen.  
      
    Liebe Grüße,  
      
    Felix Riesterer.
    
    -- 
    ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
    
    1. Ohh,

      tut mir Leid...

      ich hab da was nich richtig gelesen.

      An FelixRiesterer:
      Und wenn ich dem Verzeichnis, dass ich angezeigt haben möchte, keine anderen Verzeichnisse mehr unterbringe? Kann ich dann dein Script (dass über meinem) einfach einbinden?

      Greez Julian.

      1. Lieber JulianBaumueller,

        Und wenn ich dem Verzeichnis, dass ich angezeigt haben möchte, keine anderen Verzeichnisse mehr unterbringe? Kann ich dann dein Script (dass über meinem) einfach einbinden?

        ich habe Dir kein Script gepostet, sondern eine einzige Code-Zeile, die Du benutzen kannst, um einen gegebenen Dateinamen um seine Endung zu berauben. Nutze diese Zeile wie Du willst.

        Was Du wahrscheinlich auch benötigst, ist is_file()... am besten in einer if-Anweisung.

        Liebe Grüße,

        Felix Riesterer.

        --
        ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)