Harald: Dateinamen zerlegen mit regulären Ausdrücken

hi!

ich hab ein upload-script und wollte mithilfe von substr() die Datei in Name und Endung zerlegen, aber wenn ich z.B. html habe, sind das nicht wie üblich 3, sondern 4 Zeichen => substr() funktuoniert nicht
Deshalb hatte ich mir gedacht das müsste doch auch mit regulären Ausdrücken gehen => stimmt das?
$str = preg_replace('=(.*).(.*)=', '\1I\2', $str);

Hier sollte der Dateiname bookmarks.html in bookmarksI.html umgewandelt werden. reguläre Ausdfrücke sind normalerweise eh "gefrässig", oder? => es wird immer der letzte Punkt genommen (z.B. hallo.bookmarks.html => hallo.bookmarksI.html und nicht halloI.bookmarks.html)

  1. Hi,

    ich hab ein upload-script und wollte mithilfe von substr() die Datei in Name und Endung zerlegen, aber wenn ich z.B. html habe, sind das nicht wie üblich 3, sondern 4 Zeichen => substr() funktuoniert nicht

    natürlich funktioniert es noch, wenn Du es richtig anwendest.

    Deshalb hatte ich mir gedacht das müsste doch auch mit regulären Ausdrücken gehen => stimmt das?

    Ja.

    $str = preg_replace('=(.*).(.*)=', '\1I\2', $str);

    Komisch, zweimal ist Dir die Bedeutung von "." bewusst, einmal nicht, und die Bedeutung des Maskierens offenbar gar nicht. Aber sag mal, was passiert eigentlich, wenn eine Datei _keine_ Erweiterung hat?

    Hier sollte der Dateiname bookmarks.html in bookmarksI.html umgewandelt werden.

    Danke, dass Du das dazu sagst; aus Deinem Code lässt es sich nämlich nicht erkennen.

    reguläre Ausdfrücke sind normalerweise eh "gefrässig", oder?

    Ja.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. hi Cheatah!

      $str = preg_replace('=(.*).(.*)=', '\1I\2', $str);

      Komisch, zweimal ist Dir die Bedeutung von "." bewusst, einmal nicht, und die Bedeutung des Maskierens offenbar gar nicht. Aber sag mal, was passiert eigentlich, wenn eine Datei _keine_ Erweiterung hat?

      hoppla, hab da mit kopieren und umschreiben nen schönen blödsinn geschrieben^^
      => $str = preg_replace('(.*).(.*)', '\1I.\2', $str);

      Ich habe oben schon eine Abfrage, die alle php-Dateien und shtml-Dateien (aus sicherheitsgründen), sowie alle Dateien OHNE Erweiterung in .txt umwandelt

      Was meinst du, dass mir die Bedeutung des Maskierens nicht bekannt ist?

      Hier sollte der Dateiname bookmarks.html in bookmarksI.html umgewandelt werden.

      Danke, dass Du das dazu sagst; aus Deinem Code lässt es sich nämlich nicht erkennen.

      Hier wäre ein richtiger Code echt super gewesen ....

      thx
      Harald

      1. Hi,

        Komisch, zweimal ist Dir die Bedeutung von "." bewusst, einmal nicht, und die Bedeutung des Maskierens offenbar gar nicht. Aber sag mal, was passiert eigentlich, wenn eine Datei _keine_ Erweiterung hat?
        hoppla, hab da mit kopieren und umschreiben nen schönen blödsinn geschrieben^^

        gut, damit streiche ich den Teilsatz mit der Maskierung,

        Ich habe oben schon eine Abfrage, die alle php-Dateien und shtml-Dateien (aus sicherheitsgründen), sowie alle Dateien OHNE Erweiterung in .txt umwandelt

        und hiermit den zweiten oben zitierten Satz. Es verbleibt:

        | Komisch, zweimal ist Dir die Bedeutung von "." bewusst, einmal nicht.

        Was meinst du, dass mir die Bedeutung des Maskierens nicht bekannt ist?

        Der Backslash war reichlich willkürlich gesetzt.

        Hier wäre ein richtiger Code echt super gewesen ....

        Wieso sollte ich Dir Schaden zufügen?

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
  2. Hallo Harald.

    ich hab ein upload-script und wollte mithilfe von substr() die Datei in Name und Endung zerlegen, aber wenn ich z.B. html habe, sind das nicht wie üblich 3, sondern 4 Zeichen => substr() funktuoniert nicht
    Deshalb hatte ich mir gedacht das müsste doch auch mit regulären Ausdrücken gehen => stimmt das?

    Sicher, aber warum nutzt du nicht pathinfo() dafür?

    $str = preg_replace('=(.*).(.*)=', '\1I\2', $str);

    Hier sollte der Dateiname bookmarks.html in bookmarksI.html umgewandelt werden.

    Dieser Ausdruck:

    ( = Eine geöffnete Klammer
      .* = Kein oder beliebig viele Zeichen
       ) = eine verwaiste Kapselungsklammer
       . = Ein beliebiges Zeichen
    (.*) = Kein oder beliebig viele Zeichen, gekapselt

    Besser:

    $str = preg_replace('=(.+)\.(.+)=', '$1I.$2', $str);

    reguläre Ausdfrücke sind normalerweise eh "gefrässig", oder? => es wird immer der letzte Punkt genommen (z.B. hallo.bookmarks.html => hallo.bookmarksI.html und nicht halloI.bookmarks.html)

    In einem solchen Fall musst du ihre Gier unterbinden.

    Einen schönen Sonntag noch.

    Gruß, Ashura

    --
    Selfcode: sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
    30 Days to becoming an Opera8 Lover -- Keyboard Shortcuts
    Meine Browser: Opera 8.50 | Firefox 1.0.7 | Lynx 2.8.5 | Konqueror 3.3.2 | Netscape 4.7 | IE 6.0
    Use OpenOffice.org
    1. hi Ashura!

      Sicher, aber warum nutzt du nicht pathinfo() dafür?

      aber das funktioniert bei $_FILES['datei']['tmp_name'] nicht, da diese Datei z.B. unter /tmp/hdjfggfr liegt

      $str = preg_replace('=(.+)\.(.+)=', '$1I.$2', $str);

      DANKE
      für was steht das +, wo ist da ein unterschied zum *
      ist ein unterschied zw. ! und $1?

      reguläre Ausdfrücke sind normalerweise eh "gefrässig", oder? => es wird immer der letzte Punkt genommen (z.B. hallo.bookmarks.html => hallo.bookmarksI.html und nicht halloI.bookmarks.html)

      In einem solchen Fall musst du ihre Gier unterbinden.

      wieso, ich will doch gierige Ausdrücke!

      DANKE
      Harald

      1. Hallo Roland.

        Sicher, aber warum nutzt du nicht pathinfo() dafür?

        aber das funktioniert bei $_FILES['datei']['tmp_name'] nicht, da diese Datei z.B. unter /tmp/hdjfggfr liegt

        Wie kommst du an den Dateinamen?

        für was steht das +, wo ist da ein unterschied zum *

        Dies kannst du dir hier erlesen.

        ist ein unterschied zw. ! und $1?

        Ersteres funktioniert nicht. Siehe auch Backreferences.

        wieso, ich will doch gierige Ausdrücke!

        Ja, ich habe dich missverstanden.

        Einen schönen Sonntag noch.

        Gruß, Ashura

        --
        Selfcode: sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
        30 Days to becoming an Opera8 Lover -- Keyboard Shortcuts
        Meine Browser: Opera 8.50 | Firefox 1.0.7 | Lynx 2.8.5 | Konqueror 3.3.2 | Netscape 4.7 | IE 6.0
        Use OpenOffice.org
        1. Hallo.

          ist ein unterschied zw. ! und $1?

          Ersteres funktioniert nicht. Siehe auch Backreferences.

          Erst ausprobieren, dann posten: natürlich funktioniert ersteres, wenn du anstelle des Ausrufezeichens eine Nummer von 1 bis 9 notierst.

          Ich persönlich kannte bisher nur \n und $n.

          Einen schönen Sonntag noch.

          Gruß, Ashura

          --
          Selfcode: sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
          30 Days to becoming an Opera8 Lover -- Keyboard Shortcuts
          Meine Browser: Opera 8.50 | Firefox 1.0.7 | Lynx 2.8.5 | Konqueror 3.3.2 | Netscape 4.7 | IE 6.0
          Use OpenOffice.org
        2. Hallo Ashura!

          Hallo Roland.

          Ich heiß eigentlich Harald, ich hab nur vom PC eines Freundes geschrieben, der im selfhtml-forum eingeloggt war und deshalb stand unabsichtlich Roland^^

          Wie kommst du an den Dateinamen?

          mit _FILES['datei']['name']

          » für was steht das +, wo ist da ein unterschied zum *
          In diesem Fall ist es aber egal, denn kein Zeichen kann sowieso nicht vorkommen ...

          wünsch dir auch nen schönen Tag
          Harald

          1. Hallo Harald.

            Wie kommst du an den Dateinamen?
            mit _FILES['datei']['name']

            Und warum meinst du darauf nicht pathinfo() anwenden zu können?

            Einen schönen Sonntag noch.

            Gruß, Ashura

            --
            Selfcode: sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
            30 Days to becoming an Opera8 Lover -- Keyboard Shortcuts
            Meine Browser: Opera 8.50 | Firefox 1.0.7 | Lynx 2.8.5 | Konqueror 3.3.2 | Netscape 4.7 | IE 6.0
            Use OpenOffice.org
            1. hi!

              bei

              echo $_FILES['datei']['name']["basename"]."-test-".$_FILES['datei']['name']["extension"];  
              
              

              erhalte ich nur
              "b-test-b"

              lg
              Harald

              1. Moin!

                bei

                echo $_FILES['datei']['name']["basename"]."-test-".$_FILES['datei']['name']["extension"];

                
                > erhalte ich nur  
                > "b-test-b"  
                  
                Das ist komisch. Ich erhalte (und erwarte auch nur) die Ausgabe von  
                -test-  
                bei deinem angegebenen Code.  
                  
                Das könnte vielleicht aber auch daran liegen, dass du nicht allen Code hingeschrieben hast, den du verwendest.  
                  
                 - Sven Rautenberg
                
                -- 
                My sssignature, my preciousssss!
                
                1. hi!

                  Warum erwartest du bei $_FILES['datei']['name']["basename"] und$_FILES['datei']['name']["extension"] nur eine leere Ausgabe?

                  lg
                  harald

                  1. Moin!

                    Warum erwartest du bei $_FILES['datei']['name']["basename"] und$_FILES['datei']['name']["extension"] nur eine leere Ausgabe?

                    Weil ich in meinem Testcode keine inhaltliche Vorlegung programmiert habe. $_FILES ist sogar SOOO leer, dass mir PHP zwei Notice-Meldungen generiert:

                    Notice: Undefined index: datei in /var/www/htdocs/test.php on line 2
                    Notice: Undefined index: datei in /var/www/htdocs/test.php on line 2

                    Oder mit anderen Worten: Wenn du behauptest, pathinfo() wäre unzutreffend, mußt du bitteschön für eine Fehleranalyse auch deinen kompletten relevanten Code mitliefern - mithin also ALLERALLERMINDESTENS (!!!1) die Anwendung dieser Funktion. Andernfalls kann man, genau wie du auch, nur sagen: Funktioniert wohl nicht. Im Gegensatz zu dir, der das auf die Funktion schiebt, schiebe ich das aber auf die falsche Programmierung - die man aber bis jetzt nur erahnen, aber nicht sehen kann.

                    - Sven Rautenberg

                    --
                    My sssignature, my preciousssss!
      2. Hi,

        DANKE
        für was steht das +, wo ist da ein unterschied zum *
        ist ein unterschied zw. ! und $1?

        und da wundern sich Leute, weshalb ich es für schädlich halte, Code zu nennen.

        wieso, ich will doch gierige Ausdrücke!

        So, willst Du die? Oder doch nur den?

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes