ebody: html_entity_decode Problem

Hallo,

ich habe verschiedene Werte die als HTML Zeichen vorhanden sind. Das was besonders umständlich macht, ist dass sogar das & eines HTML Zeichens auch nochmal in als HTML Zeichen verwendet wird.

Im Script brauche ich die Werte später als richige Zeichen, so wie im Browser dargestellt werden würden. Diese Werte möchte ich überprüfen, ob z.B. ein ; vorkommt, daher ist es wichtig, dass ich die umgewandelten Werte prüfen kann. Z.B. kommt ein ; in Ø vor. Würde ich den HTML Code überprüfen (∅), würde immer ein ; gefunden werden.

Mit dem folgenden Code funktioniert die Umwandlung in ein echtes Zeichen, nur bei $str1 nicht.

Weiß jemand warum nicht?

$str1 = "'"; 	// '	
$str2 = "∅";	// Ø
$str3 = "&";	// &
$str4 = ">";	// >

// str1: '
echo "<p>str1: ".html_entity_decode(html_entity_decode($str1))." </p>";

// str2: Ø
echo "<p>str2: ".html_entity_decode(html_entity_decode($str2))." </p>";

// str3: &
echo "<p>str3: ".html_entity_decode(html_entity_decode($str3))." </p>";

// str4: >
echo "<p>str4: ".html_entity_decode(html_entity_decode($str4))." </p>";

Gruß ebody

  1. @@ebody

    Weiß jemand warum nicht?

    Zunächst fällt auf, dass du keine Flags für html_entity_decode() setzst und damit der Ausgangswert 'ENT_COMPAT | ENT_HTML401' gilt.

    ENT_COMPAT Konvertiert doppelte Anführungszeichen und lässt einfache Anführungszeichen unberührt“ ist wohl nicht das, was du willst.

    Desweiteren gibt es in HTML 4.01 keine Zeichenentityreferenz &apos; – das Flag solltest du auf ENT_HTML5 setzen.

    Allerdings erhalte ich auch mit diesen Änderungen immer noch &apos; im generierten Quelltext. Da bin ich mit meinem Latein erstmal am Ende.

    LLAP 🖖

    --
    “When UX doesn’t consider all users, shouldn’t it be known as ‘Some User Experience’ or... SUX? #a11y” —Billy Gregory
    1. Hi,

      Allerdings erhalte ich auch mit diesen Änderungen immer noch &apos; im generierten Quelltext. Da bin ich mit meinem Latein erstmal am Ende.

      ist &apos; in HTML5 definiert?

      In HTML 4.01 gibt's das nicht - in XML schon. Aber ob's das auch in HTML5 gibt, weiß ich nicht.

      cu,
      Andreas a/k/a MudGuard

      1. @@MudGuard

        ist &apos; in HTML5 definiert?

        Ja.

        Aber ob's das auch in HTML5 gibt, weiß ich nicht.

        Kann man ja mal schnell nachschlagen: 8.5. Named character references

        LLAP 🖖

        --
        “When UX doesn’t consider all users, shouldn’t it be known as ‘Some User Experience’ or... SUX? #a11y” —Billy Gregory
        1. @@Gunnar Bittersmann

          ist &apos; in HTML5 definiert?

          Ja.

          Weiß PHP das?

          Wurde da vielleicht bei der Implementierung von html_entity_decode() geschlampt und das ist ein PHP-Fehler?

          LLAP 🖖

          --
          “When UX doesn’t consider all users, shouldn’t it be known as ‘Some User Experience’ or... SUX? #a11y” —Billy Gregory
        2. Hi,

          Kann man ja mal schnell nachschlagen: 8.5. Named character references

          Wenn man weiß, wo, ist das schnell gemacht ...

          Tolle Tabelle. Was hat das mit der leeren, dafür aber extrem (geschätzte 64000 - oder 65536 - Pixel) breiten dritten Spalte auf sich?

          Und warum sind viele Einträge doppelt (mal mit, mal ohne ;)?

          cu,
          Andreas a/k/a MudGuard

          1. @@MudGuard

            Kann man ja mal schnell nachschlagen: 8.5. Named character references

            Wenn man weiß, wo, ist das schnell gemacht ...

            Wenn man sich die Spec öfter vornimmt, weiß man, dass da das Pferd von hinten aufgezäumt wird. In Kapitel 4 stehen die Elemente und deren Attribute, und wie man det Janze in Code packt, det krieje mer später.

            Man kann auch einfach im Inhaltsverzeichnis auf der Startseite nach „character“ suchen.

            Tolle Tabelle. Was hat das mit der leeren, dafür aber extrem (geschätzte 64000 - oder 65536 - Pixel) breiten dritten Spalte auf sich?

            Und warum sind viele Einträge doppelt (mal mit, mal ohne ;)?

            Vielleich hätte man das Spec-Schreiben Leuten überlassen sollen, die sich mit HTML auskennen? ;-)

            LLAP 🖖

            --
            “When UX doesn’t consider all users, shouldn’t it be known as ‘Some User Experience’ or... SUX? #a11y” —Billy Gregory
            1. Hallo Gunnar Bittersmann,

              Wenn man sich die Spec öfter vornimmt, weiß man, dass da das Pferd von hinten aufgezäumt wird. In Kapitel 4 stehen die Elemente und deren Attribute, und wie man det Janze in Code packt, det krieje mer später.

              Vielleich hätte man das Spec-Schreiben Leuten überlassen sollen, die sich mit HTML auskennen? ;-)

              Vielleicht schaut man auch einfach in der richtigen™ Spec[1] nach, statt in der Entwicklungsumgebung?

              Bis demnächst
              Matthias

              --
              Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.

              1. wie es auch das Wiki tut ↩︎

              1. @@Matthias Apsel

                Vielleicht schaut man auch einfach in der richtigen™ Spec nach, statt in der Entwicklungsumgebung?

                Wenn man der Zeit eins, zwei Jahre hinterherlaufen möchte, tut man das. ;-)

                LLAP 🖖

                --
                “When UX doesn’t consider all users, shouldn’t it be known as ‘Some User Experience’ or... SUX? #a11y” —Billy Gregory
                1. Wenn man der Zeit eins, zwei Jahre hinterherlaufen möchte, tut man das. ;-)

                  Und warum sollte in produktiven, womöglich veralteten Version von PHP (ich habe die Frage nach der Version nicht gesehen) etwas umgesetzt sein, was in einer "Entwicklungsumgebung" steht?

    2. Tach!

      Allerdings erhalte ich auch mit diesen Änderungen immer noch &apos; im generierten Quelltext. Da bin ich mit meinem Latein erstmal am Ende.

      Die Übersetzung richtet sich nach dem, was die Funktion get_html_translation_table() ausspuckt. ENT_HTML5 reicht da noch nicht, da muss ENT_QUOTES|ENT_HTML5 genommen werden. (Nimmt man ENT_HTML401 statt ENT_HTML5, übersetzt sich das ' zu &#039;.)

      dedlfix.

      1. @@dedlfix

        ENT_HTML5 reicht da noch nicht, da muss ENT_QUOTES|ENT_HTML5 genommen werden.

        Darauf wies ich bereits hin.

        Und auch darauf, dass das bei mir keine Änderung erwirkt.

        LLAP 🖖

        --
        “When UX doesn’t consider all users, shouldn’t it be known as ‘Some User Experience’ or... SUX? #a11y” —Billy Gregory
        1. Tach!

          ENT_HTML5 reicht da noch nicht, da muss ENT_QUOTES|ENT_HTML5 genommen werden.

          Darauf wies ich bereits hin.

          Na gut, aber indirekt.

          Und auch darauf, dass das bei mir keine Änderung erwirkt.

          Dann hast du wohl was falsch gemacht.

          dedlfix.

          1. @@dedlfix

            ENT_HTML5 reicht da noch nicht, da muss ENT_QUOTES|ENT_HTML5 genommen werden.

            Darauf wies ich bereits hin.

            Na gut, aber indirekt.

            ENT_COMPAT … ist wohl nicht das, was du willst“ sollte direkt genug sein. Zumal ich die entsprechende Stelle in der Doku verlinkt habe. Dort das passende Flag zu finden ist ebody wohl zuzutrauen. Die Energie des Verstehens.

            Und auch darauf, dass das bei mir keine Änderung erwirkt.

            Dann hast du wohl was falsch gemacht.

            Was denn?

            Grmpf, ja. Ich hatte die Flags gesetzt:

            $str1 = "&amp;apos;"; 	// '	
            $flags = ENT_QUOTES | ENT_HTML5;
            
            // str1: &apos;
            echo "<p>str1: ".html_entity_decode(html_entity_decode($str1, $flags))." </p>";
            

            – aber eben nur einmal, bei der inneren html_entity_decode(). Die äußere habe ich glatt übersehen. :-/

            Dort müssen die Flags hin:

            echo "<p>str1: ".html_entity_decode(html_entity_decode($str1), $flags)." </p>";
            

            und schon geht’s.

            Kann nicht schaden, die Flags bei beiden zu setzen:

            echo "<p>str1: ".html_entity_decode(html_entity_decode($str1, $flags), $flags)." </p>";
            

            LLAP 🖖

            --
            “When UX doesn’t consider all users, shouldn’t it be known as ‘Some User Experience’ or... SUX? #a11y” —Billy Gregory
          2. Habe es gerade mal mit PHP unter Windows ausprobiert, ENT_QUOTES | ENT_HTML5 funkt bei mir (PHP 5.6 und 7.1). Man muss es natürlich dem äußeren Decode übergeben (oder besser noch beiden :) ).

            Mit ENT_QUOTES | ENT_HTML401 erhalte ich allerdings &apos; und keine Hex-Sequenz. Kann das ein Unterschied Mac/Linux/Windows sein?

            Rolf

            EDIT: LOL, das kommt davon wenn man lange rumbastelt und PHP Versionen vergleicht... Als ich anfing, war es vor 9.

            1. Tach!

              Mit ENT_QUOTES | ENT_HTML401 erhalte ich allerdings &apos; und keine Hex-Sequenz. Kann das ein Unterschied Mac/Linux/Windows sein?

              Kaum. Das wird eine PHP-Geschichte sein und keine Funktion, die zum Betriebssystem durchgereicht wird. Ich nehme auch nicht an, dass in diesem Fall betriebssystemabhängig innerhalb PHPs entschieden wird.

              dedlfix.

              1. Tja, ich auch nicht. Aber nun steck ich mir doch die Pfeife in den Mund und frage: Watson, warum bekommt dedlfix die Hex-Sequenz und ich &apos;?

                1. Tach!

                  Tja, ich auch nicht. Aber nun steck ich mir doch die Pfeife in den Mund und frage: Watson, warum bekommt dedlfix die Hex-Sequenz und ich &apos;?

                  Mit ENT_QUOTES | ENT_HTML401 erhalte ich allerdings &apos; und keine Hex-Sequenz. Kann das ein Unterschied Mac/Linux/Windows sein?

                  Also, wenn ich &apos; durch html_entity_decode() mit den genannten Flags schicke, bekomme ich &apos; raus, weil das einfach nicht erkannt und unverändert durchgereicht wird. Ich weiß ja nicht, was du erwartet hast, und ich weiß ebensowenig wie ich bei Gunnars erstem Versuch wusste, was konkret ihr da macht und gemacht habt, wenn ihr keinen nachvollziehbaren Code liefert.

                  dedlfix.

                  1. Hallo dedlfix,

                    ich beziehe mich eigentlich auf diese Aussage von Dir:

                    (Nimmt man ENT_HTML401 statt ENT_HTML5, übersetzt sich das ' zu &#039;.)

                    Und hatte das so verstanden, dass Du dann aus &apos; ein &#039; herausbekommst.

                    Rolf

                    1. Tach!

                      ich beziehe mich eigentlich auf diese Aussage von Dir:

                      (Nimmt man ENT_HTML401 statt ENT_HTML5, übersetzt sich das ' zu &#039;.)

                      Und hatte das so verstanden, dass Du dann aus &apos; ein &#039; herausbekommst.

                      Nö, die Funktion übersetzt ja nur zwischen Zeichen und Entitäten/NCRs, nicht aber Entitäten zu NCRS oder umgekehrt.

                      dedlfix.

            2. @@Rolf b

              Mit ENT_QUOTES | ENT_HTML401 erhalte ich allerdings &apos; und keine Hex-Sequenz.

              Ist ja folgerichtig: „html_entity_decode — Konvertiert alle benannten HTML-Zeichen in ihre entsprechenden Ursprungszeichen.“

              Da &apos; in HTML 4.01 kein benanntes Zeichen darstellt, gibt’s da auch nichts zu konvertieren.

              LLAP 🖖

              --
              “When UX doesn’t consider all users, shouldn’t it be known as ‘Some User Experience’ or... SUX? #a11y” —Billy Gregory
              1. Ich denke, ich werde zusätzlich &apos; abfangen und durch ' ersetzen.

                Vielen Dank für eure Hilfe.

                Gruß ebody