claus ginsel: php explode

Guten Morgen

ich stolpere gerade über explode, angewendet auf eine xml-Struktur.

zB wollte ich <name> und </name> als Trennzeichen nehmen und musste aber feststellen, dass nur Blödsinn rauskommt, weil, wie ich mir jetzt selbst erklärt habe, ohne einen Hinweis in der Doku auf php.net zu finden, < und > ersetzt werden durch nix?!

Ersetze ich im Vorfeld die < und > durch zB ( und ), dann funktioniert das Konstrukt.

Sind + im String enthalten, werden diese ebenfalls rausgehauen und durch Leerzeichen ersetzt.

Kann mir jemand eine Quelle benennen, wo ich dieses Verhalten von explode dokumentiert finde?

Gruß Claus

akzeptierte Antworten

  1. Moin Claus,

    ich stolpere gerade über explode, angewendet auf eine xml-Struktur.

    zB wollte ich <name> und </name> als Trennzeichen nehmen und musste aber feststellen, dass nur Blödsinn rauskommt, weil, wie ich mir jetzt selbst erklärt habe, ohne einen Hinweis in der Doku auf php.net zu finden, < und > ersetzt werden durch nix?!

    Kannst du bitte ein Beispiel zeigen?

    Ersetze ich im Vorfeld die < und > durch zB ( und ), dann funktioniert das Konstrukt.

    Sind + im String enthalten, werden diese ebenfalls rausgehauen und durch Leerzeichen ersetzt.

    Das liest sich nach URL-Dekodierung? Passiert in deinem Code noch mehr als nur explode?

    Kann mir jemand eine Quelle benennen, wo ich dieses Verhalten von explode dokumentiert finde?

    Die PHP-Dokumentation (von explode) ist meines Wissens vollständig.

    Viele Grüße
    Robert

    1. Hallo,

      Die PHP-Dokumentation (von explode) ist meines Wissens vollständig.

      mu. Das halte ich für unmöglich.
      Sie enthält vielleicht alles, was die Dokumentierenden für dokumentationswürdig halten. Aber vollständig? Niemals.

      Beispiel „explode“: separator ist ein $string. Gezeigt werden aber nur Beispiele in denen separator ein $zeichen ist.
      Ob und wenn ja, welchen Unterschied das macht, darf $user selber ausprobiern.

      Jedenfalls scheint es nicht vorgesehen zu sein, zwei unterschiedliche Separatoren zu haben.

      Gruß
      Kalk

      1. Hallo Kalk

        Jedenfalls scheint es nicht vorgesehen zu sein, zwei unterschiedliche Separatoren zu haben.

        nacheinander in einer Kaskade

        Gruß Claus

      2. Moin Kalk,

        Die PHP-Dokumentation (von explode) ist meines Wissens vollständig.

        mu. Das halte ich für unmöglich.
        Sie enthält vielleicht alles, was die Dokumentierenden für dokumentationswürdig halten. Aber vollständig? Niemals.

        Wieso sollte die „niemals vollständig“ sein? Eine Funktion ist doch klar definiert (selbst in C, wo Funktionen im Fehlerfall „undefiniertes Verhalten“ zeigen).

        Beispiel „explode“: separator ist ein $string. Gezeigt werden aber nur Beispiele in denen separator ein $zeichen ist.
        Ob und wenn ja, welchen Unterschied das macht, darf $user selber ausprobiern.

        Was ist denn in deiner Nomenklatur der Unterschied zwischen einem Zeichen und einem String?

        Jedenfalls scheint es nicht vorgesehen zu sein, zwei unterschiedliche Separatoren zu haben.

        Laut Dokumentation hat jeder Funktionsaufruf genau einen Separator, das ist IMHO eindeutig.

        Viele Grüße
        Robert

        1. @@Robert B.

          Was ist denn in deiner Nomenklatur der Unterschied zwischen einem Zeichen und einem String?

          In meiner: Ein Zeichen ist ein Element des Zeichensatzes (i.a.R. Unicode). Ein String ist eine Aneinanderreihung von 0 bis n Zeichen.

          🖖 Живіть довго і процвітайте

          PS. echo strlen('ä'); // 2 😆

          --
          When the power of love overcomes the love of power the world will know peace.
          — Jimi Hendrix
          1. PS. echo strlen('ä'); // 2 😆

            Nicht wenn Du das mit dem selig gesprochenem HTML-Editor und also mit einer ISO-Kodierung speicherst… Aber zeigen wir doch etwas mehr:

            <?php
            echo 'mb_internal_encoding( \'UTF-8\' );' . PHP_EOL;
            mb_internal_encoding( 'UTF-8' );
            
            $string = 'ä';
            
            echo '                      $string = \'' . $string . '\'' .  PHP_EOL;
            echo "                 strlen( '$string' ) : " . strlen( $string ) . PHP_EOL;
            echo "              mb_strlen( '$string' ) : " . mb_strlen( $string ) . PHP_EOL;
            echo "iconv_strlen( '$string' , 'UTF-8')   : " . iconv_strlen( $string ) . PHP_EOL;
            echo '                    $string[0] : ' . $string[0] . PHP_EOL;
            echo '$arr = mb_split( \'\', \'' . $string . '\', 1 )'  . PHP_EOL;
            $arr = mb_split( '', $string, 1 );
            echo '                       $arr[0] : ' . $arr[0] . PHP_EOL;
            
            
            /tmp > php test.php 
            mb_internal_encoding( 'UTF-8' );
                                  $string = 'ä'
                             strlen( 'ä' ) : 2
                          mb_strlen( 'ä' ) : 1
            iconv_strlen( 'ä' , 'UTF-8')   : 1
                                $string[0] : �
            $arr = mb_split( '', 'ä', 1 )
                                   $arr[0] : ä
            
            
            1. @@Raketenwilli

              PS. echo strlen('ä'); // 2 😆

              Nicht wenn Du das mit dem selig gesprochenem HTML-Editor und also mit einer ISO-Kodierung speicherst…

              Das hat nichts mit Editor oder Codierung zu tun, sondern damit, dass die in der PHP-Doku unter „Stringfunktionen“ gelisteten Funktionen keine Stringfunktionen sind. Stringfunktionen fangen in PHP mit mb_ an.

              🖖 Живіть довго і процвітайте

              PS: Zum Vergleich JavaScript:

               ergibt 1;  ergibt 2

              --
              When the power of love overcomes the love of power the world will know peace.
              — Jimi Hendrix
              1. Stringfunktionen fangen in PHP mit mb_ an.

                Naja. Die Doku sieht das anders. Sagen wir:

                Anno 2022 brauchbare Stringfunktionen fangen in PHP mit mb_ an.“

                echo             ord( 'ä' ); #: 195
                echo mb_ord( 'ä', 'UTF-8' ); #: 228
                
    2. Moin Robert

      Das liest sich nach URL-Dekodierung? Passiert in deinem Code noch mehr als nur explode?

      ja 😉

      Der zu trennende String wird zuvor per Ajax übertragen:

      			xhttp.open("POST", "new_ajax.php", true);
      			xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
      
      

      Ich danke Dir, Robert

      1. Der zu trennende String wird zuvor per Ajax übertragen:

        xhttp.open("POST", "new_ajax.php", true);
        xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        
        

        Das ist aber Javascript.

        Du sollst aber herzeigen was mit welchen Daten gemacht wird und klar zeigen, was Du erwartest:

        Also gehe in der new_ajax.php an geeigneter Stelle folgende Schritte:

        <?php
        $string = ...
        var_dump( $string );
        $arr = explode( ..., ... );
        var_dump( $arr );
        ...
        

        Die Auslassungen musst Du selbst ersetzen. Teste und zeige nach jedem Schritt einzeln durch Ausgabe der Parameter der Funktionen und deren Ausgaben (Returns). Überprüfe, wo und wann etwas auftaucht, was Deinen Vorstellungen nicht entspricht.

        Falls Du das im Browser betrachtest, dann zeige den Quelltext, nicht das, was dieser aus dem vermeintlichen HTML macht.

        • Vermutlich klärt dieses zu eruieren schon Deinen Irrtum.
        • Und warum ist eigentlich Dein PHP-Quelltext so „hoch geheim“? Ich glaube nicht, dass da was drin ist, was ich Dir stehlen könnte. Auch alles mögliche andere habe ich schon am FKK-Strand gesehen.
  2. @@claus ginsel

    ich stolpere gerade über explode, angewendet auf eine xml-Struktur.

    Leider lässt du uns an deinen Gehversuchen nicht teilhaben. Es fehlt die Problembeschreibung: Was versuchst du? Und warum? Was ist dein Ziel?

    Du möchtest XML parsen? Dann ist explode (Stringfunktionen, reguläre Ausdrücke) das Problem, nicht die Lösung. Wenn du einen Parser willst, willst du einen Parser.

    🖖 Живіть довго і процвітайте

    --
    When the power of love overcomes the love of power the world will know peace.
    — Jimi Hendrix
    1. Moin Gunnar

      ich brauche keinen Parser. ich will lediglich ein paar Daten in einer festen Struktur verpackt versenden. Und da XML so allgegenwärtig ist, nahm ich als Struktur halt sowas ähnliches. Kann auch was ganz anderes sein.

      Gruß Claus

      1. Hallo claus,

        ich brauche keinen Parser

        Möglicherweise nicht, aber wenn Du XML einlesen willst, brauchst Du keinesfalls Stringfunktionen (wozu ich explode und preg_match jetzt hinzurechne). XML ist eine komplexe Struktur, in der die strukturgebenden Zeichen möglicherweise maskiert vorkommen, und dafür ist ein Tool erforderlich, das sich damit auskennt. Andernfalls rennst Du mit deinem Eigengewächs irgendwann vor die Pumpe, oder programmierst die fertigen Libraries am Ende nach. Einfachere Alternativen zu XMLParser und den zugehörigen Funktionen habe ich in einem anderen Posting gelistet.

        Und du möchtest XML nicht lesen, sondern schreiben? Dann füge ich meiner Liste noch einen Writer hinzu.

        Wenn es Dir nicht auf XML ankommt, gibt's auch noch JSON.

        Wer ist der Empfänger? Wieder PHP? Dann käme auch eine Serialisierung in Frage.

        Was auch immer. Mach's nicht von Hand. Es gibt genügend Fertigprodukte.

        Rolf

        --
        sumpsi - posui - obstruxi
        1. Moin Rolf

          ich muss nicht XML nehmen.

          Aber eines ist mir jetzt klar geworden: da die eigentlichen Daten auch Sonderzeichen enthalten können, sollte ich JSON zwischenschalten, der Datenfluss geht hier von Javascript zu PHP.

          Danke für Deine Hinweise.

          Gruß Claus

          1. Moin Claus,

            Aber eines ist mir jetzt klar geworden: da die eigentlichen Daten auch Sonderzeichen enthalten können, sollte ich JSON zwischenschalten, der Datenfluss geht hier von Javascript zu PHP.

            Es gibt auch Sonderzeichen, die in JSON eine Behandlung erfordern.

            Viele Grüße
            Robert

            1. Es gibt auch Sonderzeichen, die in JSON eine Behandlung erfordern.

              Aber nur wenn Du das JSON „von Hand“ erzeugst. Alle Sprachen die ich kenne und die irgendwelche JSON-Funktionen anbieten, „behandeln“ die übergebenen Daten beim Kodieren/Dekodieren selbst.

              1. Moin,

                Es gibt auch Sonderzeichen, die in JSON eine Behandlung erfordern.

                Aber nur wenn Du das JSON „von Hand“ erzeugst.

                Nein, das schreibst du ja selbst:

                Alle Sprachen die ich kenne und die irgendwelche JSON-Funktionen anbieten, „behandeln“ die übergebenen Daten beim Kodieren/Dekodieren selbst.

                Viele Grüße
                Robert

                1. Moin,

                  Es gibt auch Sonderzeichen, die in JSON eine Behandlung erfordern.

                  Aber nur wenn Du das JSON „von Hand“ erzeugst.

                  Nein, das schreibst du ja selbst:

                  Alle Sprachen die ich kenne und die irgendwelche JSON-Funktionen anbieten, „behandeln“ die übergebenen Daten beim Kodieren/Dekodieren selbst.

                  Ich, als Ganzgenauheimer, stelle nur klar, dass man als Programmierer die Daten VOR einer Kodierung als JSON eben NICHT „behandeln“ muss. Deine Äußerung erweckt aber bei unbedarften Lesern den gegenteiligen Eindruck.

          2. Hallo claus,

            die eigentlichen Daten

            sind die strukturiert? In dem Fall: JSON.stringify

            Und beim POSTen nicht den Content-type x-www-form-urlencoded setzen, sondern application/json. Auslesen im PHP dann auch nicht über $_POST, sondern - nach Prüfung des eingegangenen Content-type, per stdin.

            $data = json_decode(file_get_contents('php://input'), true);
            

            Rolf

            --
            sumpsi - posui - obstruxi
    2. Hallo Gunnar,

      Wenn du einen Parser willst, willst du einen Parser.

      Oder vielleicht auch nur einen Reader

      Oder was ganz simples

      Oder lieber ein klassisches Dokument?

      PHP bietet da eine ganze Ladung an Möglichkeiten.

      Rolf

      --
      sumpsi - posui - obstruxi