Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] kurze frage zu stripslashes

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] kurze frage zu stripslashes

    Hallo,

    was gibt folgendes Script bei euch aus?

    <?php
    echo stripslashes("aa\\aa");
    ?>

    Bei mir wird aaaa ausgegeben. Auf der Seite PHP: stripslashes - Manual steht: "Double backslashes (\\) are made into a single backslash (\)." Daher habe ich erwartet, dass aa\aa ausgegeben wird. Ich habe PHP 5.2.6 installiert.

  • #2
    wenn ich mir die Beispiele so ansehe verstehe ich das Ganze so das man einen Quote nur Escapen kann wenn man 2 anstatt einem Backslash nutzt

    so wird aus

    PHP-Code:
    echo stripslashes("ralf\\'s"); 
    Code:
    ralf's

    Kommentar


    • #3
      In dopelten Hochkommata wird aus "aa\\aa" ein aa\aa
      \a ist ein Escapecharacter

      Kommentar


      • #4
        Ist meine PHP-Version dann fehlerhaft? Die Ausgabe von
        PHP-Code:
        echo stripslashes("aa\\aa"); 
        ist bei mir eindeutig
        Code:
        aaaa
        Erwartet hätte ich wie gesagt
        Code:
        aa\aa
        als Ausgabe.

        @moveax1: Bei mir ist sowohl von
        PHP-Code:
        echo stripslashes("aa\\'aa"); 
        als auch von
        PHP-Code:
        echo stripslashes("aa\'aa"); 
        die Ausgabe:
        Code:
        aa'aa

        Kommentar


        • #5
          @nikosch: ist aber auch in Singlequotes der Fall.
          Es liegt daran, dass ein einzelner Backslash an sich erstmal ein Backslash ist:
          PHP-Code:
          print stripslashes('\ '); 
          Wird ein zweiter Backslash hinzugefügt, wird es ebenfalls als ein Backslash angesehen, diesmal allerdings in Form einer Escape-Sequenz:
          PHP-Code:
          print stripslashes('\\ '); 
          Der Funktion stripslashes() wird in beiden Fällen ein einzelner Backslash geliefert, den sie entfernt.

          Erst wenn man noch einen dritten Backslash hinzufügt, klappt's:
          PHP-Code:
          print stripslashes('\\\ '
          Warum funktioniert es auch in Singlequotes? Weil es sich hier um eine essentielle Maskierung von Begrenzern handelt. Das Maskieren von \, ' und " funktioniert zwingenderweise auch in Singlequotes.

          Kommentar


          • #6
            Toll Manko10! Danke!

            PHP-Code:
            echo '\ '
            und
            PHP-Code:
            echo '\\ '
            geben ja beide nur genau einen Backslash aus. Damit ist das in der Tat klar. Danke auch an die anderen antwortenden Menschen.

            Kommentar


            • #7
              Im Zusammenhang mit stripslashes ist das aber nur die halbe Wahrheit.
              Wie schon gesagt: Entscheidend ist aber auch das Nachfolgezeichen. Ein einzelner \ (nach Variablenparsing (@ Manko - ja ich weiß...)) bleibt ein einzelner \, solange er nicht mit dem nachfolgenden Zeichen eine Escape-Zeichensequenz bildet.

              Das ist wohlbekannt bei \n, \r, \t, \0 der Fall, aber auch bei bspw. \a etc.
              Etc: Escape-Sequenz – Wikipedia

              Wäre \a kein Escapezeichen, wäre das erwartete Ergebnis aa\aa richtig, allerdings aus anderen Gründen als Du vermutet hast.

              Kommentar


              • #8
                Wäre \a kein Escapezeichen, wäre das erwartete Ergebnis aa\aa richtig, allerdings aus anderen Gründen als Du vermutet hast.
                Die Escapesequenz \a existiert laut Manual in PHP aber nicht: PHP: Strings - Manual
                Wäre auch sinnlos, da \a einen Signalton ausgibt und das ist in PHP wahrlich sinnlos.

                Des Weiteren ist in der Tabelle \\ als Escapesequenz für einen Backslash aufgeführt. Und \ ergibt natürlich auch einen Backslash, sofern kein Zeichen folgt, das mit dem Backslash zusammen eine Escapesequenz ergibt.
                Somit sind \ und \\ jeweils nur ein Backslash, der von stripslashes() entfernt wird. Das lässt sich auch an den beiden Codes
                PHP-Code:
                print '\ '
                und
                PHP-Code:
                print '\\ '
                ersehen.

                Auch mit anderen Zeichen, die auf keinen Fall eine Escapesequenz darstellen, wird der gesamte Backslash entfernt:
                PHP-Code:
                print stripslashes('ggg\\ggg'); 

                Kommentar


                • #9
                  Auch mit anderen Zeichen, die auf keinen Fall eine Escapesequenz darstellen, wird der gesamte Backslash entfernt:
                  Ok, das habe ich nicht gewußt. das ist aber unpraktisch.

                  Zumindest in den Funktionen addcslashes und der preg_ Syntax wird \a erwähnt. Wobei die natürlich nicht direkt PHP spezifisch sind.

                  Kommentar


                  • #10
                    Das ist aber nicht nur beim Backslash so, das ist bei allen Escapesequenzen so. Nur beim Backslash fällt es besonders auf.
                    Man bedenke diesen String:
                    PHP-Code:
                    print "O'Reilly"
                    Das gibt wie erwartet
                    Code:
                    O'Reilly
                    aus.
                    Nimmt man hingegen
                    PHP-Code:
                    print "O\'Reilly"
                    dürffte das jetzt eigentlich
                    Code:
                    O\'Reilly
                    ausgeben, da es sich um eine unnötige Sequenz handelt. Tatsächlich wird aber
                    Code:
                    O'Reilly
                    ausgegeben, da Escape-Sequenzen immer geparst werden, nicht nur, wenn sie notwendig sind.
                    Erst
                    PHP-Code:
                    print "O\\'Reilly"
                    gibt das gewünschte
                    Code:
                    O\'Reilly
                    aus.

                    Ebenso ist es mit dem Backslash:
                    PHP-Code:
                    // gibt \ aus:
                    print '\ ';
                    print 
                    '\\ ';

                    // gibt \\ aus:
                    print '\\\ '

                    Kommentar


                    • #11
                      Man könnte sagen, er setzt die erste Bindung um, die definiert ist. Innerhalb von ' ' sind wohl nur \' und \\ definiert. In " " kommt das Prinzip dann weiter zum Tragen:
                      PHP-Code:
                      // gibt Umbruch aus:
                      print "\n";
                      // gibt \n aus:
                      print "\\n";
                      // gibt \Umbruch aus:
                      print "\\\n"
                      [edit] Code editiert

                      Kommentar


                      • #12
                        Genau so ist es.

                        Kommentar


                        • #13
                          Zitat von nikosch Beitrag anzeigen
                          Man könnte sagen, er setzt die erste Bindung um, die definiert ist. Innerhalb von ' ' sind wohl nur \' und \\ definiert. In " " kommt das Prinzip dann weiter zum Tragen:
                          PHP-Code:
                          // gibt Umbruch aus:
                          print '\n';
                          // gibt \n aus:
                          print '\\n';
                          // gibt \Umbruch aus:
                          print '\\\n'
                          was mich dabei nur wundert ist das doch normalerweise Escape-Sequenzen in Single-Quotes nicht beachtet werden... wieso dann in diesen Fall?

                          [edit] grad getestet dem is auch noch so .... also Fehler im Beispiel

                          Kommentar


                          • #14
                            Also nikosch nenene :P

                            Kommentar


                            • #15
                              Zitat von cycap Beitrag anzeigen
                              Also nikosch nenene :P
                              na der Ursprungscode ist von Manko10 nur sein Post lag auf der vorherigen Seite und nikosch hatte ihn zufälligerweise wiederholt ... ein wenig gewundert hatte mich das schon aber ich habs grad noch mal getestet Escape-Sequenzen in Single Quotes werden nicht beachtet bzw. nur teilweise

                              PHP-Code:
                              <?php
                              // gibt Umbruch aus:
                              print '\n<br>';
                              // gibt \n aus:
                              print '\\n<br>';
                              // gibt \Umbruch aus:
                              print '\\\n<br><hr>';

                              // gibt Umbruch aus:
                              print "\n<br>";
                              // gibt \n aus:
                              print "\\n<br>";
                              // gibt \Umbruch aus:
                              print "\\\n<br>";
                              ?>
                              Single Quotes '
                              \n
                              \n
                              \\n

                              Double Quotes "

                              \n
                              \

                              Kommentar

                              Lädt...
                              X