pascal: dateien sollen nur dateiname, keine endung haben

hallo Forum

Ich hab da ein kleines Problem: Wie kann ich ein Verzeichnis öffnen und dann die Dateien nur in einem DropdownMenu anzeigen lassen?
bis jetzt habe ich:

<?php
$verzeichnis = "texte";

echo "<select name="templates">\n";
$verzeichnis_handle = opendir("$verzeichnis");
while ($file = readdir ($verzeichnis_handle)) {
if ($file != "." && $file != "..")  {
  echo "<option value="$verzeichnis/$file" id="$file">$file</option>\n";
}
}
echo "</select name>\n";
?>

Nun möchte ich jedoch, dass die variable $file nur dem Dateinamen (ohne Endung) entspricht.

Wie muss ich das anstellen?

Vielen Dank für eure Hilfe Pascal

  1. Hi!

    [...]
    while ($file = readdir ($verzeichnis_handle)) {
    [...]

    Das sollte besser so sein:

      
    while(($file = readdir($verzeichnis_handle)) !== FALSE)  
    
    

    Ansonsten würde deine Schleife abbrechen, wenn es beispielsweise eine Datei «0» gäbe.

    Nun möchte ich jedoch, dass die variable $file nur dem Dateinamen (ohne Endung) entspricht.

    Hierzu sollte dir substr() weiterhelfen.

    Grüße,
    Fabian St.

    1. Hallo Fabian

      Hierzu sollte dir substr() weiterhelfen.

      Und ggf. noch ein paar Stringfunktionen mehr, interessant dazu ist die Diskussion in </archiv/2004/11/t94245/#m570226>.

      Freundliche Grüße

      Vinzenz

      1. hallo

        naja, das hat leider nicht ganz geklappt. zuerst hatte ich das hier:

        $rest = substr("$file", 0, -1);

        Doch das hat nicht geklappt. Also es wurde nichts ausgegeben.
        nachher Habe ich noch die Lösung von Vincent versucht, doch auch das scheiterte.

        Wenn ich es aber mit einem Text, also keiner Variable gemacht habe, klappte es.

        Wo ist da nur der Fehler!?

        Mfg Pascal

        1. hi,

          $rest = substr("$file", 0, -1);

          warum steht $file hier in anführungszeichen? absoluter unfug, weg damit.

          Wenn ich es aber mit einem Text, also keiner Variable gemacht habe, klappte es.

          dann enthält deine variable vermutlich nicht das, was du annimmst.

          Wo ist da nur der Fehler!?

          wo ist deine kontrollausgabe des variableninhaltes?

          gruß,
          wahsaga

          --
          /voodoo.css:
          #GeorgeWBush { position:absolute; bottom:-6ft; }
          1. Hi,

            Wenn ich es aber mit einem Text, also keiner Variable gemacht habe, klappte es.

            dann enthält deine variable vermutlich nicht das, was du annimmst.

            Meines Errachtens nach umgiebt die Variable ein " das stört. beim text störts natürlich nicht.

            MfG

        2. Hi!

          $rest = substr("$file", 0, -1);

          Doch das hat nicht geklappt. Also es wurde nichts ausgegeben.
          nachher Habe ich noch die Lösung von Vincent versucht, doch auch das scheiterte.

          Wenn ich es aber mit einem Text, also keiner Variable gemacht habe, klappte es.

          Der Link von Vinzenz zeigt dir bereits eine Reihe von Schwierigkeiten auf, die sich hierbei ergeben. Was willst du mit deiner Anweisung erreichen? Der Ausdruck $rest = substr($file, 0, -1) weist der Variablen $rest den letzten Buchstaben von $file zu.
          Folgendes Beispiel sollte dir da schon eher weiterhelfen:

            
          echo substr($file, 0, strrpos($file, '.'));  
          
          

          Dies gibt dir den Dateinamen ohne die Endung aus. Dabei ist es egal, ob eine Endung drei Zeichen lang ist (wie z.B. php) oder vier (--> jpeg). Dennoch behandelt dieser Fall auch nicht die Möglichkeit, dass eine Datei den Namen «foobar.tar.bz2» haben könnte - so würde hier «foobar.tar» ausgegeben werden.
          Will man diesen Fall auch noch berücksichtigen, so müsste man sich noch etwas einfallen lassen...

          Grüße,
          Fabian St.

          1. Hi,

            echo substr($file, 0, strrpos($file, '.'));

            
            >   
            > ... so würde hier «foobar.tar» ausgegeben werden.  
              
            AFAIK falsch. denn AFAIK liefert strrpos die letzte position und wenn du die letzte position als länge nimmst dann hast du foobar.tar. evt. könnt strpos noch abhilfe schaffen da strpos die erste position liefert. Je Nachdem sollte man zuvor ein If block setzte. alla  
              
            if(strpos($file, ".") === strrpos($file, '.'))  
            {  
              echo "nur ein punkt";  
            }
            
            1. Hi!

              echo substr($file, 0, strrpos($file, '.'));

              
              > >   
              > > ... so würde hier «foobar.tar» ausgegeben werden.  
              >   
              > AFAIK falsch. denn AFAIK liefert strrpos die letzte position und wenn du die letzte position als länge nimmst dann hast du foobar.tar. evt. könnt strpos noch abhilfe schaffen da strpos die erste position liefert. Je Nachdem sollte man zuvor ein If block setzte. alla  
                
              Nein, das stimmt schon. Schaue dir mal folgendes Beispiel an:  
                
              $file = 'foobar.tar.bz2';  
                
              \-------------------------------------------------------  
              f | o | o | b | a | r | . | t | a | r | . | b | z | 2 |  
              \-------------------------------------------------------  
              0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |10 |11 |12 |13 |  
              \-------------------------------------------------------  
                
              Beim Zählen von Strings beginnt PHP - wie beinahe jede andere Programmiersprache auch - bei 0. strrpos($file, '.') sucht das letzte Vorkommen des gesuchten Zeichens (--> '.') und liefert die Position, die es im String $file besitzt. In unserem Fall also 10. Daher würde auch substr($file, 0, 10) - wie von mir beschrieben - den String foobar.tar zurückliefern, da man \_hier\_ mit eins zu zählen beginnt: 1 => f, 2 => o, 3 => o, 4 => b, etc.  
                
              Wie die nun siehst, stimmt meine obige Aussage sehr wohl \*g\*  
                
              Grüße,  
              Fabian St.  
              
              -- 
              Selfcode: [ie:{ fl:( br:> va:) ls:\[ fo:) rl:( n4:( ss:) de:> js:| ch:? mo:) zu:)](http://www.peter.in-berlin.de/projekte/selfcode/?code=ie%3A%7B+fl%3A%28+br%3A%3E+va%3A%29+ls%3A%5B+fo%3A%29+rl%3A%28+n4%3A%28+ss%3A%29+de%3A%3E+js%3A%7C+ch%3A%3F+mo%3A%29+zu%3A%29)
              
              1. Hi,

                da man _hier_ mit eins zu zählen beginnt: 1 => f, 2 => o, 3 => o, 4 => b, etc.

                nicht ganz, es ist die anzahl und nicht die pos. ein $file, "0", "0" bringt nix, da er ja die länge 0 hat, strlen, ist da der übeltäter.

                Wie die nun siehst, stimmt meine obige Aussage sehr wohl *g*

                jupp, ist einleuchtend gut erklärt. wobei ich mir ja nicht sicher war,
                strpos, strlen etc. ist ja alles etwas anders. und strlen, ist der
                übeltäter welcher mich des öfteren zur weisglut bringt wegen dem ab und
                an mal vergessenen -1 in gewissen fällen. schrecklich.

                MfG

                1. Hi!

                  da man _hier_ mit eins zu zählen beginnt: 1 => f, 2 => o, 3 => o, 4 => b, etc.

                  nicht ganz, es ist die anzahl und nicht die pos. ein $file, "0", "0" bringt nix, da er ja die länge 0 hat, strlen, ist da der übeltäter.

                  Ich versteh nicht ganz, was du mir hiermit sagen willst ;-)

                  Wie die nun siehst, stimmt meine obige Aussage sehr wohl *g*

                  jupp, ist einleuchtend gut erklärt. wobei ich mir ja nicht sicher war,
                  strpos, strlen etc. ist ja alles etwas anders. und strlen, ist der
                  übeltäter welcher mich des öfteren zur weisglut bringt wegen dem ab und
                  an mal vergessenen -1 in gewissen fällen. schrecklich.

                  Die Funktion strlen() gibt dir - wie der Name bereits sagt - die Länge eines Strings als Integer-Wert zurück. Hier wäre es absolut unsinnig, wenn man bei 0 anfangen würde, da es ja dann nicht die Länge wäre. Demnach ist das Verhalten von strpos, strrpos, strlen und den anderen String-Funktionen ganz logisch und es funktioniert, wie es soll.

                  Grüße,
                  Fabian St.

  2. Hi,

    Nun möchte ich jedoch, dass die variable $file nur dem Dateinamen (ohne Endung) entspricht.

    Z.B. so:

    $file=filename($file);

    function filename($file,$nosuffix=TRUE) {
    // Dateinamen ermitteln
    $filename=basename($file);
    // Wenn Dateiendung nicht erwuenscht ...
    if($nosuffix) {
      // ... Position der Endung ermitteln ...
      $extPos=strrpos($filename,'.');
      // ... und Dateinamen ggf. kuerzen
      if($extPos) { $filename=substr($filename,0,$extPos); }
    }
    return $filename;
    }

    Gruß, Cybaer

    --
    Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!