Ingo: string von html code säubern um Inhalt zu erkennen

Mein Problem ist folgendes. Ich habe einen String der einen HTML Inhalt hat. Manchmal ist der String auch leer, hat aber Rests von HTML Code drin. Wie ermittle ich ob der String leer ist.

Beispiel Sting

<p>&nbsp;</p><p>&nbsp;</p>12

Oder

<p>&nbsp;</p><p>&nbsp;</p>

Ich habe mehrere Ideen probiert. Zuerst mit trim und dann mit ctype_alnum aber nur Buchstaben oder nur Zahlen

Dann wieder mit trim und ich dacht mir ich zähle einfach mal mit strlen nach, aber auch wenn ich mit trim lösche habe ich angeblich bei

<p>&nbsp;</p><p>&nbsp;</p>12

noch 15 Zeichen.

Ingo

  1. @@Ingo

    Mein Problem ist folgendes. Ich habe einen String der einen HTML Inhalt hat.

    Ja, genau das ist wohl dein Problem. Du machst aus EVA EAV.

    Was ist dein eigentliches Problem? Warum hast du Markup in Strings?

    😷 LLAP

    --
    “When I was 5 years old, my mother always told me that happiness was the key to life. When I went to school, they asked me what I wanted to be when I grew up. I wrote down ‘happy.’ They told me I didn’t understand the assignment, and I told them they didn’t understand life.” —John Lennon
    1. Die Daten kommen aus einem Online Editor in einem String. Diesen würde ich gerne in meiner Datenbank speichern. Aber ich habe gesehen das manchmal eben nichts drin steht. Und genauso dann würde ich eben nichts abspeichern, also muss ich irgendwie den String so säubern, das klar ist, das auch wirklich nichts drin ist Außer HTML Kommandos

      Ingo

      1. Hallo Ingo,

        strip_tags?

        Grüße, Martl

        1. Hallo,

          strip_tags?

          war auch mein erster Gedanke. Aber ich habe noch nicht ganz verstanden, was Ingo wirklich erreichen will.

          Live long and pros healthy,
           Martin

          --
          Früher war ich klein und dumm. Inzwischen hat sich so manches geändert. Ich bin größer geworden.
        2. Sorry, da habe ich beim Verfassen gepfuscht:

          ich habe meine String mit

          strip_tags

          trim

          behandelt. Dann

          strlen

          ausgeführt uns es kommt 12 herraus, aber eigentlich sollte 2 da stehen

          <p>&nbsp;</p><p>&nbsp;</p>12

          1. Hallo Ingo,

            passt doch: strlen('&nbsp;&nbsp;') = 12 Zeichen.

            Grüße, Martl

          2. Hallo Ingo,

            du brauchst html_entity_decode, um HTML Symbole wie &nbsp in echte Zeichen zu übersetzen.

            &nbsp; ist das "non breaking space", Zeichencode 160 (0xa0).

            Und dann beginnen die Probleme.

            Du musst html_entity_decode sagen, mit welchem Encoding sie das tun soll. Wenn Du das nicht tust, wird das default_charset verwendet, das für PHP eingestellt ist, und das ist seit PHP 5.6 per Default UTF-8. Und im Normalfall ist das auch richtig so.

            Nur - wenn html_entity_decode einen in UTF-8 codierten String liefert, wird aus &nbsp; eine UTF-8 Zeichensequenz 194, 160 (\xC2 \xA0), und das bedeutet: Du kannst trim() nicht mehr verwenden, um dieses Zeichen zu entfernen. trim funktioniert nur für Single-Byte Zeichensätze. Du bräuchtest mb_trim - was es aber nicht gibt. D.h. du musst die trim-Operation mit einer Regex nachbauen. Die für deinen Fall einfachste Lösung ist, einfach alle Leerzeichen zu löschen, nicht nur die am Anfang und Ende:

            $plainText = strip_tags($editText);
            $decoded = html_entity_decode($plainText, ENT_COMPAT | ENT_HTML5, 'ISO-8859-1');
            $trimmed = mb_ereg_replace('\s+', '', $text);
            

            Die mb_ereg Funktionen erkennen das &nbsp Leerzeichen als Whitespace, d.h. das \s Symbol ersetzt es durch einen Leerstring.

            Rolf

            --
            sumpsi - posui - obstruxi