Jan K.: Zeichen in PHP anders escapen

Servus,

Ich habe verschiedene Variablen, die Text beinhalten, wo beliebiger Text vorkommen kann. Unter anderem welcher, der "|" als Zeichen beinhaltet.

Dummerweise, benutze ich "|" aber gleichzeitig auch, um diese Variablen zu einer neuen zu verbinden:

$test = "$eins|zwei|$drei";

um dann zu schauen, ob mit count($test), $test auch wirklich aus 3 Teilvariablen zusammengesetzt ist. So weit so gut. Das ganze funktioniert natürlich nicht mehr, wenn "|" als Zeichen in einer der Teilvariablen vorhanden ist.

Was kann ich nun machen?

  • Den Inhalt von den Teilvariablen escapen?
  • Lieber nach einem Zeichen suchen, dass 100%ig nicht in den Teilvariablen vorkommt und das dann als Trennsequenz benutzen für $test?
  • Gibt es noch eine andere Möglichkeit?

Was würdet ihr mir raten?

  1. Tach!

    Dummerweise, benutze ich "|" aber gleichzeitig auch, um diese Variablen zu einer neuen zu verbinden:
    $test = "$eins|zwei|$drei";

    Warum machst du das und verwendest kein Array?

    um dann zu schauen, ob mit count($test), $test auch wirklich aus 3 Teilvariablen zusammengesetzt ist.

    count() auf einen String losgelassen ergibt 1. Was du da erzählst entspricht nicht dem was du tatsächlich vorliegen hast.

    Was kann ich nun machen?

    • Den Inhalt von den Teilvariablen escapen?

    Wie auch immer du auf die 3 kommst, du musst dann einen Parser oder ähnliches aufsetzen, der die maskierten | übergeht, wenn du nicht ein |-losen Ersatz verwendest. Du musst dann auch dafür sorgen, dass dieser Ersatz nicht mit Nutztext verwechselt werden kann.

    • Lieber nach einem Zeichen suchen, dass 100%ig nicht in den Teilvariablen vorkommt und das dann als Trennsequenz benutzen für $test?
    • Gibt es noch eine andere Möglichkeit?

    Für welche eigentliche Aufgabenstellung?

    dedlfix.

  2. Was kann ich nun machen?

    Arrays verwenden
    Oder CSV verwenden und die dafür nötigen lese- und schreibfunktionen. Denen kann man jeweils die Feldtrennzeichen und Zeichenkettenbegrenzer als Argumetne übergeben.

    • Den Inhalt von den Teilvariablen escapen?

    Möglich, ja.

    • Lieber nach einem Zeichen suchen, dass 100%ig nicht in den Teilvariablen vorkommt und das dann als Trennsequenz benutzen für $test?

    Das ist unmöglich™

    • Gibt es noch eine andere Möglichkeit?

    Was würdet ihr mir raten?

    Zuerst zu beschreiben warum du Variablen zusammenhängen musst und diese dann wieder in Variablen einfügen - ohne diese essentielle Information kann man dir schwer helfen.

    1. Hello,

      • Lieber nach einem Zeichen suchen, dass 100%ig nicht in den Teilvariablen vorkommt und das dann als Trennsequenz benutzen für $test?

      Das ist unmöglich™

      Jetzt mal ganz dumm gefragt: UTF müsste doch eigentlich Bytesequenzen kennen, die kein _Zeichen_ repräsentieren. Das kannte doch eigentlich ASCII schon.

      Es geht doch um den Unterschied zwischen dem _darstellbaren_ ("druckbaren") Zeichensatz und den Steuerzeichen.

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
      1. Tach!

        Jetzt mal ganz dumm gefragt: UTF müsste doch eigentlich Bytesequenzen kennen, die kein _Zeichen_ repräsentieren.

        Da UTF-x nur die CodePoints von Unicode repräsentiert und einige CodePoints nicht belegt sind, gibt es auch Bytesequenzen, die kein Zeichen repräsentieren.

        Das kannte doch eigentlich ASCII schon.

        Ich kenne in ASCII keine Lücke. 0x00..0x7F ist komplett belegt.

        Es geht doch um den Unterschied zwischen dem _darstellbaren_ ("druckbaren") Zeichensatz und den Steuerzeichen.

        Es geht eher darum, Daten zu trennen. Ob es dazu besser ist, auch vom Inhalt verwendete Zeichen einzuschieben, oder nicht vielleicht eine Datenstruktur geeigneter ist, kann man ohne den eigentlichen Anwendungsfall schlecht beurteilen.

        dedlfix.

  3. hi,

    Was würdet ihr mir raten?

    Bytesequenzen. D.h., anstelle mit Trennzeichen arbeitest Du mit Längenangaben oder mit Records und Feldern konstanter Länge.

    Eine Liste lässt sich z.B. so in eine Bytesequenz serialisieren, dass abwechselnd die Längenangabe und dann der Inhalt aufeinanderfolgt. Wobei: Die Längenangabe ist ein Integer und hat selbst immer eine Länge von 4 Byte (32 Bit), das kannst Du mit der pack()-Funktion und einer geeigneten Schablone machen. Eine Längenangabe beeinhaltet die Anzahl der Bytes, die danach gelesen werden müssen.

    Hotti

    --
    Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
    1. Tach!

      Was würdet ihr mir raten?
      Bytesequenzen. D.h., anstelle mit Trennzeichen arbeitest Du mit Längenangaben oder mit Records und Feldern konstanter Länge.

      Das ist viel zu umständlich in der Handhabung im Gegensatz zu un/serialize(), besonders wenn die Datenstruktur bereits in Form eines Array oder Objekts vorliegt. un/pack() würde ich nur dann verwenden, wenn fremde Daten, die in einem solchen Format vorliegen, verarbeitet werden müssen.

      dedlfix.

      1. Hello,

        Was würdet ihr mir raten?
        Bytesequenzen. D.h., anstelle mit Trennzeichen arbeitest Du mit Längenangaben oder mit Records und Feldern konstanter Länge.

        [...] un/pack() würde ich nur dann verwenden, wenn fremde Daten, die in einem solchen Format vorliegen, verarbeitet werden müssen.

        Oder eben, wenn er eine Random-Access Datei aufbauen will.

        Records (mit fester Satzlänge) und blockorientierter Dateizugriff werden von PHP ja leider immer noch nicht vernünftig unterstüzt. Da muss man noch sehr viel selber basteln.

        Ok, der nächste Schritt heißt dann sowieso gleich "Datenbank". Aber man muss ja nicht immer gleich Kanonen benutzen, wenn es ein Dartpfeil auch tut :-)

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Tach!

          [...] un/pack() würde ich nur dann verwenden, wenn fremde Daten, die in einem solchen Format vorliegen, verarbeitet werden müssen.
          Oder eben, wenn er eine Random-Access Datei aufbauen will.

          Kein Mensch will das heutzutage mehr.

          Records (mit fester Satzlänge) und blockorientierter Dateizugriff werden von PHP ja leider immer noch nicht vernünftig unterstüzt.

          Warum auch? Es gibt SQLite.

          Da muss man noch sehr viel selber basteln.

          Das entfällt bei SQLite. Selbst Verwaltungsaufgaben wie das Ändern des Datensatz-Formats gehen mit für SQLite verfügbaren Tools schnell und einfach. Im Gegensatz zu RA-Dateien, bei denen man sich das Umkopier-Tool erst noch selbst schreiben muss.

          Ok, der nächste Schritt heißt dann sowieso gleich "Datenbank". Aber man muss ja nicht immer gleich Kanonen benutzen, wenn es ein Dartpfeil auch tut :-)

          Genau, deswegen gibt es ja die kleine Datenbank.

          dedlfix.

  4. Was kann ich nun machen?

    Was genau willst Du denn machen?

    Du hast im CSV - zeichengetrennte Werte.

    Variante 1: benutze die CSV-Funktionen von PHP.
    Variante 2: benutze tatsächlich etwas, was nicht vorkommt: Wie wäre mit einem Tab?: define ('TRENNER',"\t")

    Variante 3 und das ist die beste:

    Wenn Du einen Array hast (und Du hast einen!), warum nimmst Du dann keinen Array? Geht es Dir darum, die Daten zu übertragen oder zu speichern, dann bieten sich

    var_dump(): einfacher textdump von Variablen, Arrays, Objekten
    serialize(): "serialisieren" von Variablen, Arrays
    json_encode(): einfacher textdump von Variablen, Arrays

    an. Das geht jeweils auch rückwärts.

    Ansonsten wirst Du einer Google-Suche mit "PHP Arrays in Dateien" sofort fündig.

    Fred

    1. Variante 1: benutze die CSV-Funktionen von PHP.

      Das sagte ich bereits.

      Variante 2: benutze tatsächlich etwas, was nicht vorkommt: Wie wäre mit einem Tab?: define ('TRENNER',"\t")

      Und du kannst ausschließen, dass ein Tab nicht doch in der Zeichenkette vorkommt?

      Variante 3 und das ist die beste:

      Wenn Du einen Array hast

      Das Array haben dedlfix und ich auch schon vorgeschlagen - aber hier ist erst zu klären, wieso die Daten überhaupt so sein sollen wie sie sein sollen.

      Wenn diese Eingaben z.B. aus einer Schnittstelle kommen und ein CSV-Format haben, müsste man dies erst in ein Array überführen - also ohne Punkt 1 kommt man so nicht zu Punkt 3.

      Aber mit Antworten ist der OP nicht sehr großzügig :)