glupto: htmlentities "bereinigen"

0 139

htmlentities "bereinigen"

glupto
  • php
  1. 0
    dedlfix
  2. 1
    TS
    1. 0
      glupto
      1. 0
        Auge
        1. 0

          Korrektur meines vorherigen Postings

          Auge
          1. 0
            glutpo
            1. 1
              Der Martin
              1. 0
                glutpo
                1. 0
                  Der Martin
                  1. 0
                    glutpo
                    1. 0
                      Der Martin
                      1. 0
                        glutpo
                        1. 0
                          Der Martin
                        2. 0

                          meta-charset - Angabe war nicht innerhalb der ersten 1024 Bytes

                          TS
                          1. 0
                            dedlfix
                            1. 0

                              Fakten, Fakten, Fakten

                              TS
                              • meinung
                              • php
                  2. 0
                    Gunnar Bittersmann
            2. 0
              Auge
              • html
              • php
              1. 0
                glutpo
                1. 0
                  Camping_RIDER
                  1. 0
                    Gunnar Bittersmann
                    1. 0
                      Camping_RIDER
                    2. 0

                      Meta-Angabe im File unerheblich?

                      TS
                    3. 0

                      Offenheit für Fehlerquellen

                      Camping_RIDER
                      • html
                      • menschelei
                      • php
                  2. 0
                    glutpo
                    1. 0
                      Matthias Apsel
                      1. 0
                        Gunnar Bittersmann
                        1. 0
                          Tabellenkalk
                      2. 0
                        Tabellenkalk
                2. 1
                  Auge
                  1. 0
                    dedlfix
                    1. 0

                      Aha, dann weiter im Text.

                      Auge
                      1. 0
                        Gunnar Bittersmann
                        • html
                        • sprache
                        1. 0
                          Auge
                        2. 0
                          Gunnar Bittersmann
                      2. 0
                        dedlfix
                        1. 0

                          Danke erstmal an alle,...

                          glupto
                          1. 0
                            dedlfix
                    2. 0
                      TS
                  2. 0
                    glupto
                    1. 0
                      dedlfix
                    2. 0
                      woodfighter
                      1. 0

                        dein Impressum

                        woodfighter
                        • recht
                        1. 0
                          glupto
                          1. 0
                            Der Martin
                      2. 0
                        glupto
                        1. 2
                          dedlfix
                          1. 0
                            glupto
                            1. 0
                              Camping_RIDER
                              1. 0
                                dedlfix
                                1. 0
                                  Camping_RIDER
                                2. 0
                                  glupto
                                  1. 0
                                    Auge
                                    1. 0
                                      glupto
                                      1. 0
                                        Auge
                                    2. 0
                                      glupto
                                      1. 0
                                        Auge
                                        1. 0
                                          glupto
                                          1. 0
                                            Auge
                                            1. 0
                                              glupto
                                              1. 0
                                                Auge
                                                • php
                                                1. 0
                                                  glupto
                                                  1. 0
                                                    TS
                                                    1. 0

                                                      DOMDocument: Fehlerhaftes Parsing und Dekodierung, [gelöst]

                                                      TS
                                                      1. 0
                                                        glupto
                                                        1. 0

                                                          DOMDocument: Fehlerhafte Dekodierung, Jetzt aber...

                                                          TS
                                                      2. 0
                                                        dedlfix
                                                    2. 0
                                                      glupto
                                                      1. 0

                                                        Bitte ändert doch den Betreff immer passend ab

                                                        TS
                                                        • meinung
                                                        • php
                                                        1. 0
                                                          dedlfix
                                                          1. 0

                                                            Ätsch, war trotzdem falsch. Aber nun gibts Workaround:

                                                            TS
                                                            • php
                                                            1. 0

                                                              Kurzfassung

                                                              TS
                                                              1. 0
                                                                TS
                                                                1. 1
                                                                  TS
                                                                  1. 0
                                                                    dedlfix
                                                                    1. 0
                                                                      TS
                                                            2. 0

                                                              Weiterführende Gedanken zur gefundenen Lösung

                                                              TS
                                                              1. 0
                                                                dedlfix
                                                                1. 0
                                                                  TS
                                                                  1. 0
                                                                    dedlfix
                                                                    1. 0
                                                                      TS
                                                                      1. 0
                                                                        dedlfix
                                                                        1. 0
                                                                          glupto
                                                                          1. 0
                                                                            TS-ohne
                                                                            1. 0
                                                                              glupto
                                                                              1. 0

                                                                                SR-Nachrichten Excerpt

                                                                                TS
                                                                                • html
                                                                                • php
                                                                                1. 0
                                                                                  glupto
                                                                                  1. 0
                                                                                    TS
                                                                                    1. 0
                                                                                      glupto
                                                                                      1. 0
                                                                                        TS
                                                                                        1. 0
                                                                                          glupto
                                                                                          1. 0
                                                                                            Gunnar Bittersmann
                                                                                            • design/layout
                                                                                            1. 0
                                                                                              glupto
                                                                                              1. 0

                                                                                                SR-Nachrichten Excerpt, Grabbellösung

                                                                                                TS
                                                                                                • html
                                                                                                • php
                                                                                                1. 0
                                                                                                  glupto
                                                                                                  1. 0

                                                                                                    SR-Nachrichten Excerpt, Grabbel- und Guck-Lösung

                                                                                                    TS
                                                                                                    1. 0
                                                                                                      glupto
                                                                                                2. 0
                                                                                                  glupto
                                                                                                  1. 0
                                                                                                    TS
                                                                                                    1. 0
                                                                                                      glupto
                                                                                                      1. 0
                                                                                                        Auge
                                                                                                        1. 0
                                                                                                          glupto
                                                                                                          1. 0

                                                                                                            Einen Datengrabber schreiben, wie geht es weiter?

                                                                                                            TS
                                                                                                            1. 0
                                                                                                              glupto
                                                                                                              1. 0
                                                                                                                TS
                                                                                                                1. 0
                                                                                                                  glupto
                                                                                                            2. 0
                                                                                                              glupto
                                                                                                          2. 0
                                                                                                            Auge
                                                                                                            • php
                                                                                                            1. 0
                                                                                                              glupto
                                                                                        2. 0

                                                                                          Völlig offtopic, Frage an TS

                                                                                          Jörg Reinholz
                                                                                          • offtopic
                                                                                          1. 0
                                                                                            Matthias Apsel
                                                                                            • zu diesem forum
                                                                                          2. 0
                                                                                            TS
                                                                                            1. 2
                                                                                              Jörg Reinholz
                                                                                        3. 0
                                                                                          Auge
                                                                                          • https
                                                                                          • php
                                                                                          1. 0
                                                                                            glupto
                                                                                            1. 0
                                                                                              Auge
                                                                                              1. 0
                                                                                                glupto
                                                                                                1. 0
                                                                                                  Auge
                                                                                                2. 0
                                                                                                  Jörg Reinholz
                                                                                                  • https
                                                                                                  • recht
                                                                                          2. 0
                                                                                            TS
                                                                                            1. 0
                                                                                              Auge
                                                                                          3. 0

                                                                                            header('Content-Type: text/html; charset=UTF-8');

                                                                                            TS
                                                                                            1. 0
                                                                                              Auge
                                                                                              • https
                                                                                            2. 0
                                                                                              woodfighter
                                                                                              1. 0
                                                                                                RS
                                                                                                1. 0
                                                                                                  woodfighter
                                              2. 0
                                                dedlfix
                                          2. 0
                                            dedlfix
                                      2. 0
                                        dedlfix
                              2. 0
                                Auge
                                1. 0
                                  Camping_RIDER
                              3. 0
                                glupto
                                1. 0
                                  Camping_RIDER
                                2. 0
                                  Auge
                        2. 0

                          SR-Nachrichten als ISO interpretiert

                          TS
      2. 0
        TS
      3. 0
        Christian Kruse
        1. 0
          glupto

Hallo, ich lese eine html-Datei aus, die laut Quelltext folgendes enthält:

Dazu hat die Große Koalition das sogenannte &#8222Versorgungsstärkungsgesetz“ vorgelegt

Ich gebe das dann aus mit

 <?php echo htmlspecialchars ($text, ENT_QUOTES); ?> 

Angezeigt werden aber bei der Ausgabe statt irgendwelcher Anführungszeichen nur Fragezeichen. Wie kann ich das so konvertieren, dass es in Anführungszeichen gewandelt wird (egal welche).

Gruß glupto

  1. Tach!

    Hallo, ich lese eine html-Datei aus, die laut Quelltext folgendes enthält:

    Dazu hat die Große Koalition das sogenannte &#8222Versorgungsstärkungsgesetz&ldquo;&ensp;vorgelegt
    

    Ich gebe das dann aus mit

     <?php echo htmlspecialchars ($text, ENT_QUOTES); ?> 
    

    Angezeigt werden aber bei der Ausgabe statt irgendwelcher Anführungszeichen nur Fragezeichen.

    Das passt irgendwie nicht zusammen. Wo sollen denn die Fragezeichen herkommen? Die könnten höchstens beim ß und ä auftauchen, wenn etwas mit der Kodierung(sangabe) nicht stimmt. Du müsstest eigentlich den Text so sehen, wie du ihn hier gezeigt hast, also mit &x8222 etc, weil das htmlspecialchars() aus den & ein &amp; macht, die der Browser wieder weginterpretiert.

    Wie kann ich das so konvertieren, dass es in Anführungszeichen gewandelt wird (egal welche).

    So wie der Text vorliegt muss gar nichts konvertiert werden, weil er ja schon HTML-gerecht ist - auch wenn die Entitys zugunsten von richtigen Zeichen gleich gar nicht erst in der Quelle zu sein bräuchten. Jedenfalls, das einzige was ich sehe, ist das fehlende Semikolon nach dem &#8222.

    dedlfix.

  2. Hallo,

    Hallo, ich lese eine html-Datei aus, die laut Quelltext folgendes enthält:

    Dazu hat die Große Koalition das sogenannte  
    &#8222;Versorgungsstärkungsgesetz&ldquo;&ensp;vorgelegt
    

    Da fehlte schon mal ein Semikolon.

    Ich gebe das dann aus mit

     <?php echo htmlspecialchars ($text, ENT_QUOTES); ?> 
    

    Das ist nun auch doppelt gemoppelt. Wenn Entities im Text enthalten sind, muss man davon ausgehen, dass schon jemand versucht hat, alle HTML-fremden oder HTML-schädlichen Zeichen zu ersetzen.

    Wenn Du die vermeintlich schädlichen & nun noch einmal ersetzt, werden &amp; daraus.

    Angezeigt werden aber bei der Ausgabe statt irgendwelcher Anführungszeichen nur Fragezeichen. Wie kann ich das so konvertieren, dass es in Anführungszeichen gewandelt wird (egal welche).

    Du könntest versuchen, die Entities zurückzuwandeln in die Codierung, in der der übrige Text verfasst ist. http://php.net/manual/en/function.html-entity-decode.php

    Und dann kannst Du auf den gesamten, hoffentlich in einer einheitlichen Codierung verfassten Text, htmlspecialchars() anwenden, um den Text dann in der zur Seite passenden Codierung im HTML-Kontext auszugeben.

    Grüße
    TS

    1. Also, ich habe das jetzt so - wie von Dir empfohlen - gemacht, dennoch bekomme ich Fragezeichen. Hier ist die Originalseite (Inzwischen geht es um eine andere Meldung, aber mit demselben Problem:). Vielleicht siehst Du da ja mehr als ich.

      Saarbrücken: Uraufführung mit Flüchtlingen

      Am Sonntag bringt das Saarländische Staatstheater das Flüchtlings-Projekt „Brennpunkt X“ auf die Bühne. Die Uraufführung findet im Rohbau des erweiterten Saarlandmuseums statt. Das Stück wurde nach Interviews in der Landesaufnahmestelle Lebach von Autor Nuran David Calis entwickelt und von Regisseur Jörg Wesemüller umgesetzt. Dabei stehen sieben Flüchtlinge aus Syrien und dem Iran gemeinsam mit vier Schauspielern des Staatstheaters auf der Bühne. Sie erzählen über ihre hochriskante Flucht und ihr schwieriges Leben als Asylbewerber in Deutschland.

      Linkbeschreibung

      1. Hallo

        Also, ich habe das jetzt so - wie von Dir empfohlen - gemacht, dennoch bekomme ich Fragezeichen. Hier ist die Originalseite (Inzwischen geht es um eine andere Meldung, aber mit demselben Problem:). Vielleicht siehst Du da ja mehr als ich.

        Linkbeschreibung

        Im fraglichen Text auf der Seite findet sich kein einziges maskiertes Zeichen. Wenn du diesen Text (über welchen Weg auch immer; Welcher Weg ist es denn?) aus der Seite herausziehst und anschließend, auf deiner Seite, verstümmelte Zeichen da sind, dann fügst du sie an irgendeiner Stelle des Prozesses selbst ein.

        Beschreibe bitte erst einmal, was du machst, um an den Inhalt der Seite zu kommen.

        Tschö, Auge

        --
        Es schimmerte ein Licht am Ende des Tunnels und es stammte von einem Flammenwerfer.
        Terry Pratchett, „Gevatter Tod“
        1. Hallo

          Im fraglichen Text auf der Seite findet sich kein einziges maskiertes Zeichen.

          Das ist falsch. Ich hatte mir nur den Quelltext des markierten Bereichs angeschaut, der im Firefox als resultierendes DOM u.a. mit automatischen Korrekturen ausgegeben wird. Dort war tatsächlich kein maskiertes Zeichen vorhanden.

          Lasse ich mir den vollständigen Seitenquelltext anzeigen, wird mir der Quelltext des vom Server gelieferten Dokuments angezeigt. Dort finden sich sehr wohl maskierte Zeichen.

          das Flüchtlings-Projekt &#8222Brennpunkt X&ldquo;&ensp;auf die Bühne
          

          Wie zu sehen ist, gibt es schon dort die bereits genannten Fehler (und es sind nicht die einzigen, die sich in der Seite finden). Solche Fehler, von denen du vorher nicht weißt, wie sie konkret aussehen, automatisiert zu beheben, ist ein Ding der Unmöglichkeit. Gängige fehler wirst du aber schon beheben können.

          Daher bleibt die folgende Frage weiterhin auf dem Tableau.

          Beschreibe bitte erst einmal, was du machst, um an den Inhalt der Seite zu kommen.

          Tschö, Auge

          --
          Es schimmerte ein Licht am Ende des Tunnels und es stammte von einem Flammenwerfer.
          Terry Pratchett, „Gevatter Tod“
          1. Beschreibe bitte erst einmal, was du machst, um an den Inhalt der Seite zu kommen.

            Ich mache dies hier (und ja, es ist legal und mit sr-online abgesprochen - aber irgendwie kriegen die es wohl nicht hin, einen rss-feed anzubieten):

            $data = file_get_contents('http://www.sr-online.de/sronline/nachrichten/hoerfunknachrichten/hoerfunknachrichten_aktuell100~_seite-6.html');
            
            $doc = new DOMDocument();
            $doc->loadHTML($data);
            
            $xPath = new DOMXPath($doc);
            foreach ($xPath->query('//div/p') as $node2) {
            
            if (($zaehler <= 10)&& ($node2->nodeValue !== '') && ($node2->nodeValue !== NULL)){
            
            $array[$zaehler] = utf8_decode($node2->nodeValue);
            
            $zaehler++;
            
            }
            }
            $data = file_get_contents('http://www.sr-online.de/sronline/nachrichten/hoerfunknachrichten/hoerfunknachrichten_aktuell100.html');
            
            $doc = new DOMDocument();
            $doc->loadHTML($data);
            
            $xPath = new DOMXPath($doc);
            
            $zaehler = 0;
            foreach ($xPath->query("//div[@class=\"mitte_folgeseiten\"]/ul/li/a") as $element) { 
                if ($zaehler <= 7)
                {
                    $hreft = $element->getAttribute("href");
                    $title = $element->nodeValue;
                    $href  = "http://www.sr-online.de".$hreft;
            
            $href = utf8_decode($href);
            $title = utf8_decode($title);
                ?>                     
                                <li><a href='
                                <?php echo htmlspecialchars ($href); ?>
                                ' target='_blank'  class="ketchup tooltip" title="
                                 <?php 
                                 echo htmlspecialchars ($array[$zaehler], ENT_QUOTES);  ?>  
                                ">
                                <?php echo htmlspecialchars ($title); ?> 
                                </a></li>
                <?php
                $zaehler++;
                }
            }
            
            1. Hallo,

              $data = file_get_contents('http://www.sr-online.de/sronline/nachrichten/hoerfunknachrichten/hoerfunknachrichten_aktuell100~_seite-6.html');
              
              $doc = new DOMDocument();
              $doc->loadHTML($data);
              
              $xPath = new DOMXPath($doc);
              foreach ($xPath->query('//div/p') as $node2) {
              
              if (($zaehler <= 10)&& ($node2->nodeValue !== '') && ($node2->nodeValue !== NULL)){
              
              $array[$zaehler] = utf8_decode($node2->nodeValue);
              

              (schnipp)

              Genau hier geht's in die Binsen. Die von sr-online.de gelesene Ressource ist in UTF-8 codiert. Warum willst du sie in etwas anderes umwandeln? Genau dabei gehen dir eine Menge Zeichen verloren, die in den ISO-Latin-Codierungen nicht darstellbar sind und deshalb zu Fragezeichen umgewandelt werden.

              Warum willst du das nicht in UTF-8 lassen?

              So long,
               Martin

              1. Warum willst du das nicht in UTF-8 lassen?

                So long,
                 Martin

                Danke für die Antwort, aber wenn ich es lasse, sieht es so aus:

                Berlin: Cyberangriff auf Bundestags-IT schwerer als angenommen
                Berlin: Groko gegen drittes Griechenland-Paket
                Frankfurt: Staatsanwaltschaft bestätigt Razzia gegen mögliche Steuerbetrüger
                Wiesbaden: Betreuungsgeld für eine halbe Million Kinder
                Saarbrücken: Fast 34. 000 dauerhafte Hartz IV Empfänger im Saarland
                Saarbrücken: Uraufführung mit Flüchtlingen
                
                1. Hi,

                  Warum willst du das nicht in UTF-8 lassen?

                  Danke für die Antwort, aber wenn ich es lasse, sieht es so aus:

                  Berlin: Cyberangriff auf Bundestags-IT schwerer als angenommen
                  Berlin: Groko gegen drittes Griechenland-Paket
                  Frankfurt: Staatsanwaltschaft bestätigt Razzia gegen mögliche Steuerbetrüger
                  Wiesbaden: Betreuungsgeld für eine halbe Million Kinder
                  Saarbrücken: Fast 34. 000 dauerhafte Hartz IV Empfänger im Saarland
                  Saarbrücken: Uraufführung mit Flüchtlingen
                  

                  ja klar, so sieht UTF-8 aus, wenn man es dem Browser (Editor, sonstiger Software) beispielsweise als ISO-8859-x verkauft. Natürlich muss dein Teil der Verarbeitung dann auch durchgängig UTF-8 verwenden.

                  Wenn du das nicht willst, musst du umcodieren, etwa wie du es schon getan hast - aber dann verlierst du eben Informationen. Nämlich genau die Zeichen, die sich in der Ziel-Codierung nicht darstellen lassen.

                  Ciao,
                   Martin

                  1. ja klar, so sieht UTF-8 aus, wenn man es dem Browser (Editor, sonstiger Software) beispielsweise als ISO-8859-x verkauft. Natürlich muss dein Teil der Verarbeitung dann auch durchgängig UTF-8 verwenden.

                    Wenn du das nicht willst, musst du umcodieren, etwa wie du es schon getan hast - aber dann verlierst du eben Informationen. Nämlich genau die Zeichen, die sich in der Ziel-Codierung nicht darstellen lassen.

                    Wird meine Seite nicht in UTF8 ausgeliefert, wenn im Header steht?:

                    header("Content-Type: text/html; charset=UTF-8");
                    
                    1. Hallo,

                      Wird meine Seite nicht in UTF8 ausgeliefert, wenn im Header steht?:

                      header("Content-Type: text/html; charset=UTF-8");
                      

                      nein, nur weil man auf ein Glas Gewürzgurken ein Bild mit Pfirsichen klebt, sind noch lange keine Pfirsiche drin.

                      Andersrum wird ein Schuh draus: Zunächst mal musst du dafür sorgen, dass dein HTML tatsächlich in UTF-8 codiert ist. Und dann kommt der oben zitierte HTTP-Header zum Zug, um genau das auch dem Browser mitzuteilen.

                      Also erst Pfirsiche reintun, dann ist das aufgeklebte Pfirsichbild auch richtig.

                      So long,
                       Martin

                      1. Also erst Pfirsiche reintun, dann ist das aufgeklebte Pfirsichbild auch richtig.

                        So long,
                         Martin

                        Ja, die meta-charset - Angabe war nicht innerhalb der ersten 1024 Bytes, aber jetzt wird alles vom w3-checker als fehlerfrei angezeigt, dennoch hat das an der Darstellung nichts geändert.

                        1. Hi,

                          Also erst Pfirsiche reintun, dann ist das aufgeklebte Pfirsichbild auch richtig.

                          Ja, die meta-charset - Angabe ...

                          die ist für'n ... ähm, ist irrelevant, wenn ein gleichnamiger HTTP-Header gesendet wird. Und sie ist in Wirklichkeit auch nur wie ein Lieferschein, der im Paket liegt. Nochmal: Erst muss der Inhalt des Pakets stimmen - also der HTML-Quellcode tatsächlich in UTF-8 codiert sein. Dann legt man den Lieferschein rein, der den Inhalt beschreibt und dazu passen sollte. Also beispielsweise die meta-Angabe im Quellcode. Und zum Schluss noch der Aufdruck außen auf dem Paket (HTTP-Header), der ebenfalls zum Inhalt passen sollte.

                          So long,
                           Martin

                        2. Hallo,

                          Ja, die meta-charset - Angabe war nicht innerhalb der ersten 1024 Bytes, aber jetzt wird alles vom w3-checker als fehlerfrei angezeigt, dennoch hat das an der Darstellung nichts geändert.

                          Wenn man bedenkt, wie dicht Du hiermit schon an der Lösung warst :-)

                          Mich beruhigt aber, dass alle Mitposter genauso gerätselt haben...

                          Grüße
                          TS

                          1. Tach!

                            Mich beruhigt aber, dass alle Mitposter genauso gerätselt haben...

                            Es gab ja auch lange kein direkt nachvollziehbares Beispiel des Problems.

                            dedlfix.

                            1. Re-Tach :-)

                              Mich beruhigt aber, dass alle Mitposter genauso gerätselt haben...

                              Es gab ja auch lange kein direkt nachvollziehbares Beispiel des Problems.

                              Naja, sooo lange hat das nicht gedauert, bis die Fakten auf den Tisch kamen. Im siebten Link von oben kam die URL mit dem Musterscript.

                              Aber diese DOMDocument-Klasse ist mir auch immer noch suspekt, obwohl (mit den passenden Tricks) bisher alles klappt. Die muss man aber erst einmal kennen. Wird Zeit, sie alle aufzuschreiben.

                              Grüße
                              TS

                  2. @@Der Martin

                    Natürlich muss dein Teil der Verarbeitung dann auch durchgängig UTF-8 verwenden.
                    Wenn du das nicht willst,

                    … friert die Hölle zu.

                    Man will durchgängig UTF-8 verwenden. Immer und überall.

                    LLAP 🖖

                    --
                    „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
            2. Hallo

              Beschreibe bitte erst einmal, was du machst, um an den Inhalt der Seite zu kommen.

              Ich mache dies hier (und ja, es ist legal und mit sr-online abgesprochen - aber irgendwie kriegen die es wohl nicht hin, einen rss-feed anzubieten):

              Ok, eine Frage, auch wenn das ursächlich nichts mit deinem Problem zu tun hat. Ich sehe überall den Einsatz der Funktion utf8decode. Deine Seite wird mit der Kodierung ISO-8859-1 ausgeliefert? Ansonsten wäre der Einsatz der Funktion falsch.

              Die einzige Ausgabe, die im gezeigten Code erfolgt, ist die am Ende, wenn eine Liste mit Links zu Meldungen erstellt wird. Wenn du dort, wie hier gezeigt, mit htmlspecialchars arbeitest, bleiben die Anführungszeichen ohne die Angabe von ENT_QUOTES unangetastet. Mit der Angabe werden sie maskiert. Das gilt aber nur für die auch in HTML benutzten Anführungszeichen „"“ ([SHIFT]+[2]) und „'“ ([SHIFT]+[#]). Typografische Anführungszeichen bleiben davon unbelassen, da sie im HTML-Kontext keine Sonderbedeutung haben.

              Beim einzig fraglichen echo htmlspecialchars($title); maskierst du da auch nichts zusätzlich, so dass an dieser Stelle – wie schon von mehreren gesagt – einzig die in der Quelle bereits vorhandenen Zeichen &#8222, &ldquo; und &ensp; dazwischenfunken, weil dort das Kaufmannsund „&“ noch einmal maskiert wird, womit im HTML-Quelltext &amp;#8222, &amp;ldquo; und &amp;ensp; herauskommt. Daher wird auf der Seite &#8222, &ldquo; und &ensp; angezeigt. Dass dem Zeichen &#8222 das abschließende Semikolon fehlt, das zumindest von der Fehlerkorrektur des Firefox in der Quelle stillschweigend angenommen wird, steht auf einem weiteren Blatt.

              Tschö, Auge

              --
              Es schimmerte ein Licht am Ende des Tunnels und es stammte von einem Flammenwerfer.
              Terry Pratchett, „Gevatter Tod“
              1. Hallo

                Beschreibe bitte erst einmal, was du machst, um an den Inhalt der Seite zu kommen.

                Ich mache dies hier (und ja, es ist legal und mit sr-online abgesprochen - aber irgendwie kriegen die es wohl nicht hin, einen rss-feed anzubieten):

                Ok, eine Frage, auch wenn das ursächlich nichts mit deinem Problem zu tun hat. Ich sehe überall den Einsatz der Funktion utf8decode. Deine Seite wird mit der Kodierung ISO-8859-1 ausgeliefert? Ansonsten wäre der Einsatz der Funktion falsch.

                Das utf8decode habe ich eingefügt, weil alle Umlaute falsch ausgegeben wurden, lasse ich es weg, kommen zwar die Anführungsstriche korrekt, aber die Umlaute nicht ....In meinem Header steht:

                header("Content-Type: text/html; charset=UTF-8");
                
                
                
                1. Aloha ;)

                  Das utf8decode habe ich eingefügt, weil alle Umlaute falsch ausgegeben wurden, lasse ich es weg, kommen zwar die Anführungsstriche korrekt, aber die Umlaute nicht ....In meinem Header steht:

                  header("Content-Type: text/html; charset=UTF-8");
                  
                  
                  

                  Gibt es eventuell im HTML Konflikte mit konkurrierenden Angaben?

                  Grüße,

                  RIDER

                  --
                  Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller Erreichbar manchmal im Self-TS (ts.selfhtml.org) oder sonst - wenn online - auf dem eigenen TeamSpeak-Server (fritz.campingrider.de) oder unter: # Facebook # Twitter # Steam # YouTube # Self-Wiki # ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[
                  1. @@Camping_RIDER

                    Gibt es eventuell im HTML Konflikte mit konkurrierenden Angaben?

                    Wenn die Zeichencodierung im HTTP-Header angegeben ist, kann in der meta-Angabe im HTML stehen, was will; das wird nicht beachtet. (Dennoch sollte da natürlich auch die richtige Zeichencodierung angegeben sein.)

                    Die HTTP-Angabe kann noch vom BOM überschrieben werden. Die Angabe von UTF-8 also mit UTF-8. ;-) (Ein vorhandenes UTF-16-BOM halte ich jetzt mal für unwahrscheinlich.)

                    LLAP 🖖

                    --
                    „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
                    1. Aloha ;)

                      Wenn die Zeichencodierung im HTTP-Header angegeben ist, kann in der meta-Angabe im HTML stehen, was will; das wird nicht beachtet. (Dennoch sollte da natürlich auch die richtige Zeichencodierung angegeben sein.)

                      Das ist mir bewusst. Ich halte es trotzdem für eine mögliche Fehlerquelle (z.B. gesetzt den Fall der header wird - wieso auch immer - nicht gesendet), die überprüft und eliminiert werden sollte.

                      Grüße,

                      RIDER

                      --
                      Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller Erreichbar manchmal im Self-TS (ts.selfhtml.org) oder sonst - wenn online - auf dem eigenen TeamSpeak-Server (fritz.campingrider.de) oder unter: # Facebook # Twitter # Steam # YouTube # Self-Wiki # ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[
                    2. Hallo Gunnar,

                      Gibt es eventuell im HTML Konflikte mit konkurrierenden Angaben?

                      Wenn die Zeichencodierung im HTTP-Header angegeben ist, kann in der meta-Angabe im HTML stehen, was will; das wird nicht beachtet. (Dennoch sollte da natürlich auch die richtige Zeichencodierung angegeben sein.)

                      Die HTTP-Angabe kann noch vom BOM überschrieben werden. Die Angabe von UTF-8 also mit UTF-8. ;-) (Ein vorhandenes UTF-16-BOM halte ich jetzt mal für unwahrscheinlich.)

                      Ist schon erstaunlich, was ein paar Scheuklappen so alles bewirken können ;-D

                      Ich diesem Fall wird nur die Meta-Angabe im File ausgewertet. Wie soll die DOMDocument-Klasse auch an die HTTP-Header herankommen, wenn ihr ein String übergeben wird?

                      Der Vollständigkeit halber habe ich es auch nochmal mit

                      $dom->loadHTMLFile($url);
                      

                      ausprobiert. Da wäre ja die Möglichkeit vorhanden, an die Header heranzukommen.
                      Haben die PHP-Entwickler aber auch nicht so gemacht.

                      Grüße
                      TS

                    3. Aloha ;)

                      Gibt es eventuell im HTML Konflikte mit konkurrierenden Angaben?

                      Wenn die Zeichencodierung im HTTP-Header angegeben ist, kann in der meta-Angabe im HTML stehen, was will; das wird nicht beachtet. (Dennoch sollte da natürlich auch die richtige Zeichencodierung angegeben sein.)

                      Irgendwie lustig, dass ich im Endeffekt mit meinem ersten Rateversuch doch irgendwie auf der richtigen Spur war. Vielleicht lohnt es sich manchmal also doch, auch die abwegigen Ideen, von denen man eigentlich weiß, dass es nicht der Grund sein kann, einmal durchzuspielen ;)

                      Grüße,

                      RIDER

                      --
                      Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller Erreichbar manchmal im Self-TS (ts.selfhtml.org) oder sonst - wenn online - auf dem eigenen TeamSpeak-Server (fritz.campingrider.de) oder unter: # Facebook # Twitter # Steam # YouTube # Self-Wiki # ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[
                  2. ~

                    Gibt es eventuell im HTML Konflikte mit konkurrierenden Angaben?

                    Grüße,

                    RIDER

                    Also egal, wie ich welche utf8-Angabe (header/meta-Angabe) ändere, das Ergebnis ist immer dasselbe.

                    1. Hallo glutpo,

                      Also egal, wie ich welche utf8-Angabe (header/meta-Angabe) ändere, das Ergebnis ist immer dasselbe.

                      Und was machen die Pfirsiche?

                      Bis demnächst
                      Matthias

                      --
                      Signaturen sind bloed (Steel) und Markdown ist mächtig.
                      1. @@Matthias Apsel

                        Und was machen die Pfirsiche?

                        Nektarinen sein und sich in ihrer Haut unwohl fühlen.

                        LLAP 🖖

                        --
                        „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
                        1. Hallo,

                          Nektarinen sein und sich in ihrer Haut unwohl fühlen.

                          Aber Pfirsichhaut wird doch im Gegensatz zur Orangenhaut angestrebt!

                          Gruß
                          Kalk

                      2. Hallo,

                        Und was machen die Pfirsiche?

                        Vermutlich hat er zusätzlich zum Etikett an der Seite auch noch ein Pfirsich-Etikett auf den Deckel geklebt.

                        Gruß
                        Kalk

                2. Hallo

                  Ok, eine Frage, auch wenn das ursächlich nichts mit deinem Problem zu tun hat. Ich sehe überall den Einsatz der Funktion utf8decode. Deine Seite wird mit der Kodierung ISO-8859-1 ausgeliefert? Ansonsten wäre der Einsatz der Funktion falsch.

                  Das utf8decode habe ich eingefügt, weil alle Umlaute falsch ausgegeben wurden, lasse ich es weg, kommen zwar die Anführungsstriche korrekt, aber die Umlaute nicht ....In meinem Header steht:

                  header("Content-Type: text/html; charset=UTF-8");
                  

                  Dass der Header am Schluss zum Zuge kommt, hat dir Martin schon mit seinem Einweckgleichnis erklärt. Dröseln wir das mal auf.

                  Um die Ausgabe von UTF-8 sicher zu stellen, ist …

                  • … die Eingabe in UTF-8 vorzunehmen oder nach UTF-8 umzuwwandeln.
                  • … die durchgängige Verarbeitung in der kodierung UTF-8 durchzuführen.
                  • … die Ausgabe in UTF-8 vorzunehmen.

                  Du bekommst vom SR den Inhalt – mit all seinen Unzulänglichkeiten – in UTF-8. Du gibst auf deiner Seite, wenn auch verkrüppelt, UTF-8 aus. Irgendwo dazwischen geht etwas schief. Da ist einerseits die falsche Umwandlung mit utf8decode, da ist aber wohl auch noch etwas anderes. Ich vermute, dass es mit dem Parameter Charset der Funktion htmlspecialchars zu tun hat. Unter PHP 5.4 und 5.5 wird standardmäßig UTF-8 verwendet, frühere PHP-Versionen verwenden ISO-8859-1, ab PHP 5.6 wird standardmäßig die mit default_charset ermittelte Kodierung verwendet.

                  Hast du nun deinen nach ISO-8859-1 umgewandelten String und jagst ihn durch htmlspecialchars, welches mangels anderer Angaben UTF-8 verwendet (oder umgekehrt) wird bei Zeichen, die in der jeweils anderen Kodierung nicht oder an anderer Stelle vorkommen, Salat herauskommen. Nutze also den Paramater Charset für htmlspecialchars.

                  Ansonsten fällt mir im gezeigten Code nur noch eines auf.

                                      <li><a href='
                                      <?php echo htmlspecialchars ($href); ?>
                                      ' target='_blank'  class="ketchup tooltip" title="
                  

                  Benutze zur Behandlung von $href nicht htmlspecialchars, sondern rawurlencode, das dazu da ist, Sonderzeichen des Kontexts URL zu maskieren (z.B. Leerzeichen in Dateinamen als „%20“).

                  Tschö, Auge

                  --
                  Es schimmerte ein Licht am Ende des Tunnels und es stammte von einem Flammenwerfer.
                  Terry Pratchett, „Gevatter Tod“
                  1. Tach!

                    Ich vermute, dass es mit dem Parameter Charset der Funktion htmlspecialchars zu tun hat. Unter PHP 5.4 und 5.5 wird standardmäßig UTF-8 verwendet, frühere PHP-Versionen verwenden ISO-8859-1, ab PHP 5.6 wird standardmäßig die mit default_charset ermittelte Kodierung verwendet.

                    Irrelevant. Die von htmlspecialchars() betroffenen Zeichen sind alle im ASCII-Bereich. Das ist nur bei irgendwelchen asiatischen Kodierungen wichtig, die die "ASCII-Bytes" auch anderweitig wiederverwenden.

                    dedlfix.

                    1. Hallo

                      Ich vermute, dass es mit dem Parameter Charset der Funktion htmlspecialchars zu tun hat. Unter PHP 5.4 und 5.5 wird standardmäßig UTF-8 verwendet, frühere PHP-Versionen verwenden ISO-8859-1, ab PHP 5.6 wird standardmäßig die mit default_charset ermittelte Kodierung verwendet.

                      Irrelevant. Die von htmlspecialchars() betroffenen Zeichen sind alle im ASCII-Bereich. Das ist nur bei irgendwelchen asiatischen Kodierungen wichtig, die die "ASCII-Bytes" auch anderweitig wiederverwenden.

                      Ok, wieder etwas gelernt.

                      Dann von einer anderen Stelle aus.

                      Wir wissen, dass der SR seine Seite(n) in UTF-8 kodiert. Wir wissen, dass bestimmte Zeichen im Text als HTML-Entities [&ldquo; und &ensp;] und als (unvollständige) Zeichenreferenz (Heißt das so?) [&#8222] maskiert sind [1]. Zudem gibt es ein paar unmaskierte Umlaute.

                      Frage an glupto: An welcher Stelle im Verarbeitungsprozess werden die Zeichen verkrüppelt? Nutze zur Ermittlung bitte nach jedem Bearbeitungschritt jeweils echo '<pre>'. vardump($betroffeneVariable) .'</pre>';.

                      Tschö, Auge

                      --
                      Es schimmerte ein Licht am Ende des Tunnels und es stammte von einem Flammenwerfer.
                      Terry Pratchett, „Gevatter Tod“

                      1. Warum beide Systeme (in der Beispielmeldung unnötigerweise) vermischt werden und warum &ldquo; (left double quote) am rechten Ende des eingefassten Textes steht, bleibt wohl ungeklärt. ↩︎

                      1. @@Auge

                        warum &ldquo; (left double quote) am rechten Ende des eingefassten Textes steht, bleibt wohl ungeklärt.

                        Letzteres ist einfach erklärt: Die Bezeichnung LEFT DOUBLE QUOTATION MARK bezieht sich auf die Verwendung des Zeichens “ U+201C im Englischen. Dort wird es als öffnendes Anführungszeichen verwendet, steht also links. Als schließendes Anführungszeichen dient ” U+201D RIGHT DOUBLE QUOTATION MARK (HTML-Entity &rdquo;).

                        Anders im Deutschen: Da wird “ als schließendes Anführungszeichen verwendet. Das öffnende Anführungszeichen ist „ U+201E DOUBLE LOW-9 QUOTATION MARK (HTML-Entity &sbquo;, ja &sbquo;).

                        LLAP 🖖

                        --
                        „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
                        1. Hallo

                          warum &ldquo; (left double quote) am rechten Ende des eingefassten Textes steht, bleibt wohl ungeklärt.

                          Die Bezeichnung LEFT DOUBLE QUOTATION MARK bezieht sich auf die Verwendung des Zeichens “ U+201C im Englischen. Dort wird es als öffnendes Anführungszeichen verwendet, steht also links. …

                          Anders im Deutschen: Da wird “ als schließendes Anführungszeichen verwendet.

                          Als HTML-Entity wird also das englischsprachige Anführungszeichen als deutschsprachiges Ausführungszeichen wiederverwendet.

                          Ich zitiere mich dann auch mal: Ok, wieder etwas gelernt.

                          Tschö, Auge

                          --
                          Es schimmerte ein Licht am Ende des Tunnels und es stammte von einem Flammenwerfer.
                          Terry Pratchett, „Gevatter Tod“
                        2. @@Gunnar Bittersmann

                          Das öffnende Anführungszeichen ist „ U+201E DOUBLE LOW-9 QUOTATION MARK (HTML-Entity &sbquo;, ja &sbquo;).

                          Ähm nein. s wie SINGLE, d wie DOUBLE. Also HTML-Entity &bdquo; – mit b und d in der richtigen Reihenfolde.

                          LLAP 🖖

                          --
                          „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
                      2. Tach!

                        Frage an glupto: An welcher Stelle im Verarbeitungsprozess werden die Zeichen verkrüppelt? Nutze zur Ermittlung bitte nach jedem Bearbeitungschritt jeweils echo '<pre>'. vardump($betroffeneVariable) .'</pre>';.

                        In dem Fall bitte echo urlencode($betroffeneVariable); statt var_dump() verwenden.

                        urlencode() lässt sich bei Zeichenkodierungsproblemen sehr gut missbrauchen. var_dump() liefert im Zweifelsfall ein wie auch immer geartetes Zeichen und man kann nur anhand der Stringlänge grob schließen, ob ein oder zwei Byte verwendet wurden. urlencode() zeigt alles außer den uninteressanten Grundbuchstaben quasi in Byte-Form an.

                        dedlfix.

                        1. ... muss jetzt leider andere Sachen arbeiten, werde aber die Empfehlungen Schritt für Schritt durcharbeiten. Habe eben zu Sicherheit noch mal die php-Datei in utf8 ohne BOM abgespeichert. Ändert es etwas an der UTF8-Kodierung einer Seite, wenn ich einmal ein ü als &uuml; definiert habe.? Im Header steht es auch richtig. Dann werde ich mal durchchecken, wo die Zeichen in die Grütze gehen.

                          Gruß glupt

                          1. Tach!

                            Ändert es etwas an der UTF8-Kodierung einer Seite, wenn ich einmal ein ü als &uuml; definiert habe.?

                            Die Kodierung wird nicht vom Inhalt festgelegt, sondern von dem der den Inhalt in eine computerlesbare Form bringt, also dein Texteditor oder das Programm, das die Daten erzeugt beziehungsweise weiterverarbeitet.

                            dedlfix.

                    2. Selber Tach!

                      Ich vermute, dass es mit dem Parameter Charset der Funktion htmlspecialchars zu tun hat. Unter PHP 5.4 und 5.5 wird standardmäßig UTF-8 verwendet, frühere PHP-Versionen verwenden ISO-8859-1, ab PHP 5.6 wird standardmäßig die mit default_charset ermittelte Kodierung verwendet.

                      und die kann man mandativ machen:

                      php_admin_value default_charset iso-8859-1 
                      

                      an passender Stelle in der Apache-Konfiguration untergebracht und es lässt sich mit PHP nix mehr steuern.

                      Außerdem könnte auch ein

                      AddDefaultCharset ON
                      

                      dafür sorgen, dass der Apache (2.2) nur die Default-Einstellung ISO-8859-1 benutzt

                      http://httpd.apache.org/docs/2.2/de/mod/core.html#AddDefaultCharset

                      Bevor Ihr weiter Rätselraten spieolt, sollte man erst einmal nachgucken, was wo eingestellt ist und was tatsächlich beim Client ankommt. Eine Änderung nur per header() in PHP ist jedenfalls nicht immer möglich.

                      Grüße TS

                  2. Also, ich habe jetzt den Inhalt mir var_dump ausgegeben, vorher die ganze Seite in utf8 konvertiert/abgespeichert und wieder hochgeladen. Resultat:

                    string(502) "Die EU gibt der griechischen Regierung im Schuldenstreit noch eine Woche, um mit den Gläubigern zu einer Einigung zu kommen. EU-Ratspräsident Tusk sagte, es gebe keine Zeit mehr für Spielchen. Ein Sprecher des Internationalen Währungsfonds ergänzte, es gebe mit Athen noch immer wesentliche Differenzen in entscheidenden Punkten. Aus Sicht von EU-Kommissionspräsident Juncker waren Gespräche mit Griechenlands Regierungschef Tsipras aber konstruktiv verlaufen. Holger Romann: O-Ton"

                    Leider ist im Moment in der Description der Seite kein Anführungszeichen mehr, so dass ich diese Fehler jetzt nicht testen kann, aber auf jeden Fall werden die Umlaute nicht korrekt ausgegeben, bzw. sie kommt gar nicht korrekt an nach dem $data = file_get_contents...

                    Anzuschauen unter der Testseite: Linkbeschreibung

                    1. Tach!

                      string(502) "Die EU gibt der griechischen Regierung im Schuldenstreit noch eine Woche, um mit den Gläubigern zu einer Einigung zu kommen.

                      Das ist UTF-8 interpretiert als ISO-8859-1 und nochmal nach UTF-8 konvertiert.

                      Nimm das urlencode() und geh schrittweise durch die Verarbeitungsschritte. Als erstes gleich nach dem Holen anschauen, dann weiter nach jedem Schritt. Irgendwo hast du eine unnötige Umkodierung. Die brauchst du vielleicht für andere Quellen, die ihr Zeug in ISO-8859-1 liefern, aber dann musst du das eben fallweise machen.

                      dedlfix.

                    2. Tach,

                      Also, ich habe jetzt den Inhalt mir var_dump ausgegeben, vorher die ganze Seite in utf8 konvertiert/abgespeichert und wieder hochgeladen. Resultat: Anzuschauen unter der Testseite: Linkbeschreibung

                      die Seite wird als UTF-8 ausgeliefert, allerdings hast du die Daten der SR-Nachrichten fälschlicherweise als Iso interpretiert und zu UTF-8 kodiert obwohl sie bereits UTF-8 waren, deswegen die Fehler mit den Umlauten in dem Textteil.

                      mfg
                      Woodfighter

                      1. Tach,

                        andere Baustelle: „Mit Urteil vom 12. Mai 1998 hat das Landgericht Hamburg entschieden“; dieses Urteil ist nie rechtskräftig geworden und sagte außerdem das Gegenteil von dem aus, was du behauptest.

                        Und noch was anderes: du hast mit allen betroffenen Verlagen/Seiten Vereinbarungen wg. des Urheber- und Leistungsschutzrechtes getroffen?

                        mfg
                        Woodfighter

                        1. Tach,

                          andere Baustelle: „Mit Urteil vom 12. Mai 1998 hat das Landgericht Hamburg entschieden“; dieses Urteil ist nie rechtskräftig geworden und sagte außerdem das Gegenteil von dem aus, was du behauptest.

                          Und noch was anderes: du hast mit allen betroffenen Verlagen/Seiten Vereinbarungen wg. des Urheber- und Leistungsschutzrechtes getroffen?

                          mfg
                          Woodfighter

                          Danke für den Hinweis mit dem Urteil, das hatte ich von einer offenbar nicht empfehlenswerten Rechtsberatungsseite übernommen.

                          Ich habe nicht mit jedem einzelnen Medium Einzelabsprachen. Bei allen außer NDR und SR nutze ich den angebotenen Rss-feed, den ich laut Rechtshinweis der jeweiligen Seiten in meine Homepage einbinden darf, solange das nicht zu kommerziellen Zwecken stattfindet, keine frames verwendet werden und auf die Quelle hingewiesen und verlinkt wird. Mit SR und NDR habe ich Einzelvereinbarungen getroffen. Im Übrigen sind einige Medien (RP-Online, DLF) auf die Seite aufgenommen worden, weil mich die jeweiligen Verlage/Redaktionen ausdrücklich darum gebeten haben.

                          Gruß glupto

                          1. Hallo,

                            Danke für den Hinweis mit dem Urteil, das hatte ich von einer offenbar nicht empfehlenswerten Rechtsberatungsseite übernommen.

                            mag sein, aber das Märchen vom Hamburger Landgericht ist doch mittlerweile so alt, dass man meinen sollte, es hätte sich mittlerweile herumgesprochen, dass das Käse ist, wie es meistens gebraucht und dargestellt wird.

                            Ich habe nicht mit jedem einzelnen Medium Einzelabsprachen. Bei allen außer NDR und SR nutze ich den angebotenen Rss-feed, den ich laut Rechtshinweis der jeweiligen Seiten in meine Homepage einbinden darf, solange das nicht zu kommerziellen Zwecken stattfindet, keine frames verwendet werden und auf die Quelle hingewiesen und verlinkt wird.

                            Das ist dann vermutlich in Ordnung.

                            Mit SR und NDR habe ich Einzelvereinbarungen getroffen. Im Übrigen sind einige Medien (RP-Online, DLF) auf die Seite aufgenommen worden, weil mich die jeweiligen Verlage/Redaktionen ausdrücklich darum gebeten haben.

                            Das hast du hoffentlich auch schriftlich, dann klingt das für mich ziemlich wasserdicht.

                            Ciao,
                             Martin

                      2. allerdings hast du die Daten der SR-Nachrichten fälschlicherweise als Iso interpretiert und zu UTF-8 kodiert obwohl sie bereits UTF-8 waren, deswegen die Fehler mit den Umlauten in dem Textteil.

                        mfg
                        Woodfighter

                        Wodurch interpretiere ich die SR-Nachrichten als ISO?

                        1. Tach!

                          allerdings hast du die Daten der SR-Nachrichten fälschlicherweise als Iso interpretiert und zu UTF-8 kodiert obwohl sie bereits UTF-8 waren, deswegen die Fehler mit den Umlauten in dem Textteil.

                          Wodurch interpretiere ich die SR-Nachrichten als ISO?

                          Mal ohne ein Blatt vor den Mund zu nehmen: Im Moment scheinst du mir bezüglich der Zeichenkodierung ziemlich rumzueiern. Du probierst aufs Geratewohl Sachen aus, bis es richtig aussieht, aber ohne dass du die Grundlagen verstanden hast. Das kannst du ändern, wenn du mal Grundlagenliteratur dazu liest. Die Frage nach dem "Was ist das überhaupt?" und "Warum gibt es so viele?" sind unter anderem in unserer Dokumentation geklärt.

                          Zu deiner eigentlichen Frage: Du hast da eine Folge von Bytes vorliegen. Wenn du die genauso interpretierst, wie sie der Sender kodiert hat, dann ist alles in Ordnung und du bekommst genau dieselben Zeichen raus, die der Sender gemeint hat. Wenn du sie aber nach einer anderen Vorschrift interpretierst, kommt Mist raus. In deinem Fall nimmst du vermutlich eine Umkodierfunktion, die die Zeichen in der einen Kodierung interpretiert (in der sie aber nicht vorliegen) und dann in eine andere zu bringen versucht. So entsteht der Salat.

                          Du musst schon genau wissen, welche Kodierung vorliegt und welche es werden soll. Dass du mit unterschiedlichen Quellen arbeitest, die unterschiedlich kodiert sein können, macht die Sache nicht einfacher.

                          Deine nächste Frage wird sein, wie du die Kodierung automatisch erkennen kannst. Nun, es gibt da einige Indizien, aber die sind nicht vollständig aussagekräftig oder es ist manchmal gar unmöglich, die Kodierung aus den Daten heraus zu erraten. Eigentlich senden die Quellen (oder solltes es zumindest) immer mit, welche Kodierung vorliegend ist. Dazu musst du aber die HTTP-Header auswerten und gegebenenfalls die Ersatzangabe im HTML-Head. Oder du machst es dir einfach und untersuchst die Kodierungsangaben der einzelnen Quellen zu Fuß und nimmst an, dass das in Zukunft so bleiben wird und hartkodierst deine gegebenenfalls notwendigen Umkodierfunktionen je nach Quelle.

                          dedlfix.

                          1. Ja, du hast recht, ich eiere da herum, ich habe mir auch die wiki-Seite durchgelesen, sehe aber immer noch nicht, wo ich im untenstehenden php etwas umkodieren sollte?

                            $data = file_get_contents('http://www.sr-online.de/sronline/nachrichten/hoerfunknachrichten/hoerfunknachrichten_aktuell100.html');
                            
                            $doc = new DOMDocument();
                            $doc->loadHTML($data);
                            
                            $zaehler = 0;
                            
                            $xPath = new DOMXPath($doc);
                            foreach ($xPath->query('//div/p') as $node2) {
                            
                            if (($zaehler <= 10)&& ($node2->nodeValue !== '') && ($node2->nodeValue !== NULL)){
                            
                            $array[$zaehler] = $node2->nodeValue;
                            

                            Wenn ich anschließend den Inhalt von $node2->nodeValue mit var_dump ausgebe, kommt schon Umlaut-Müll heraus.

                            Gruß glupto

                            1. Aloha ;)

                              Wenn ich anschließend den Inhalt von $node2->nodeValue mit var_dump ausgebe, kommt schon Umlaut-Müll heraus.

                              Klar. Weil deine Header-Daten sagen "ich bin UTF-8" und die Daten unter http://www.sr....html offensichtlich nicht UTF-8 sind.

                              Was dedlfix dir sagen wollte ist, dass du irgendwo in deinem Skript zwischen dem Einlesen der Daten (was du aktuell mit file_get_contents tust) und der Ausgabe eine (korrekte) Konvertierung vornehmen musst. Dazu brauchst du zwei Informationen: das Eingabeformat (das musst du rausbekommen) und das Ausgabeformat (hier UTF-8).

                              Das Eingabeformat findest du, wie dedlfix sagte, im http-Header (dazu musst du die Inhalte allerdings anders anfordern, file_get_contents ist da ungenügend, da dass nur die Antwort, nicht aber den Antwort-Header liefert) falls du es automatisch auslesen lassen willst (was sicher die nachhaltig gesehen bessere Variante ist), oder du bestimmst es einmal zu Fuß und kodierst es dann hart.

                              @Edit: Du könntest die Inhalte beispielsweise über http_get anfordern oder die Klassen HttpRequest/HttpMessage nutzen.

                              Grüße,

                              RIDER

                              --
                              Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller Erreichbar manchmal im Self-TS (ts.selfhtml.org) oder sonst - wenn online - auf dem eigenen TeamSpeak-Server (fritz.campingrider.de) oder unter: # Facebook # Twitter # Steam # YouTube # Self-Wiki # ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[
                              1. Tach!

                                Wenn ich anschließend den Inhalt von $node2->nodeValue mit var_dump ausgebe, kommt schon Umlaut-Müll heraus.

                                Beim Ausgeben findet wieder eine Interpretation statt, denn das ausgebende System muss ja aus den Daten entnehmen, welche Zeichen es auf die Ausgabe zu schreiben hat. Deswegen ist es bei Kodierungsproblemen ratsam, auch diese Fehlerquelle auszuschließen. Das kann man tun, indem man sich nicht das Ergebnis der (Fehl)interpretation sondern erstmal die Daten selbst anschaut. Nimm echo urlencode() und lass das var_dump() in dem Fall mal weg. Das nimmst du gleich nach dem file_get_contents().

                                Die DOMDocument-Geschichte will mit UTF-8 arbeiten. Dessen Ergebnis ist auch UTF-8. Anschauen was da rauskommt, wieder mit echo urlencode(). Wenn du Problemb%C3%A4r siehst, dann ist das auf den ersten Blick UTF-8 (wegen der zwei Bytes C3 und A4 für den Umlaut). Ein Blick in eine Zeichenkodierungstabelle offenbart, dass das ein ä ist. Bei Problemb%E4r kann es kein UTF-8 sein. Abkürzenderweise kann man hierzulande als Faustregel bei 2 Byte davon ausgehen, dass es UTF-8 ist, bei nur einem ist es höchstwahrscheinlich ISO-8859-1. I Zweifelsfall dochmal eine Zeichenkodierungstabelle bemühen.

                                Klar. Weil deine Header-Daten sagen "ich bin UTF-8" und die Daten unter http://www.sr....html offensichtlich nicht UTF-8 sind.

                                Doch, sind sie. Aber ohne geeignetes Debugging wird man wohl nicht feststellen, wo der Hund begraben ist.

                                Das Eingabeformat findest du, wie dedlfix sagte, im http-Header (dazu musst du die Inhalte allerdings anders anfordern, file_get_contents ist da ungenügend, da dass nur die Antwort, nicht aber den Antwort-Header liefert) falls du es automatisch auslesen lassen willst (was sicher die nachhaltig gesehen bessere Variante ist), [...]

                                Allein ist es ungenügend, ja. Aber die Header eines file_get_content('http(s)://...')-Aufrufs stehen in $http_response_header zur Verfügung.

                                dedlfix.

                                1. Aloha ;)

                                  Klar. Weil deine Header-Daten sagen "ich bin UTF-8" und die Daten unter http://www.sr....html offensichtlich nicht UTF-8 sind.

                                  Doch, sind sie. Aber ohne geeignetes Debugging wird man wohl nicht feststellen, wo der Hund begraben ist.

                                  Okay, ich gebs zu. Meine Aussage war geraten ;)

                                  Das Eingabeformat findest du, wie dedlfix sagte, im http-Header (dazu musst du die Inhalte allerdings anders anfordern, file_get_contents ist da ungenügend, da dass nur die Antwort, nicht aber den Antwort-Header liefert) falls du es automatisch auslesen lassen willst (was sicher die nachhaltig gesehen bessere Variante ist), [...]

                                  Allein ist es ungenügend, ja. Aber die Header eines file_get_content('http(s)://...')-Aufrufs stehen in $http_response_header zur Verfügung.

                                  Ah, sehr gut. Wieder was dazugelernt. Das ist dann natürlich einfacher als über die http-Funktionen.

                                  Grüße,

                                  RIDER

                                  --
                                  Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller Erreichbar manchmal im Self-TS (ts.selfhtml.org) oder sonst - wenn online - auf dem eigenen TeamSpeak-Server (fritz.campingrider.de) oder unter: # Facebook # Twitter # Steam # YouTube # Self-Wiki # ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[
                                2. Tach!

                                  Wenn ich anschließend den Inhalt von $node2->nodeValue mit var_dump ausgebe, kommt schon Umlaut-Müll heraus.

                                  Beim Ausgeben findet wieder eine Interpretation statt, denn das ausgebende System muss ja aus den Daten entnehmen, welche Zeichen es auf die Ausgabe zu schreiben hat. Deswegen ist es bei Kodierungsproblemen ratsam, auch diese Fehlerquelle auszuschließen. Das kann man tun, indem man sich nicht das Ergebnis der (Fehl)interpretation sondern erstmal die Daten selbst anschaut. Nimm echo urlencode() und lass das var_dump() in dem Fall mal weg. Das nimmst du gleich nach dem file_get_contents().

                                  ABer mal so gefragt: VOR dem file_get_contents habe ich doch gar keinen String, den ich mit urlencode() ausgeben könnte, also keine "reinen" Daten?

                                  1. Hallo

                                    Ahem. Da steht (Hervorhebung von mir):

                                    … Das nimmst du gleich nach dem file_get_contents().

                                    ABer mal so gefragt: VOR dem file_get_contents habe ich doch gar keinen String, den ich mit urlencode() ausgeben könnte, also keine "reinen" Daten?

                                    Tschö, Auge

                                    --
                                    Es schimmerte ein Licht am Ende des Tunnels und es stammte von einem Flammenwerfer.
                                    Terry Pratchett, „Gevatter Tod“
                                    1. Hallo

                                      Ahem. Da steht (Hervorhebung von mir):

                                      … Das nimmst du gleich nach dem file_get_contents().

                                      Ich hatte Deinen Text so verstanden: VOR DEM file_get_contents nimmst Du urlencode, danach var_dump

                                      1. Hallo

                                        … Das nimmst du gleich nach dem file_get_contents().

                                        Ich hatte Deinen Text so verstanden: VOR DEM file_get_contents nimmst Du urlencode, danach var_dump

                                        Nein. Dedlfix (nicht ich) sagte, lasse dir nach jedem Bearbeitungsschritt den Variableninhalt mit urlencode statt var_dump anzeigen, weil man damit sofort sieht, was in dem String drin steht.

                                        Tschö, Auge

                                        --
                                        Es schimmerte ein Licht am Ende des Tunnels und es stammte von einem Flammenwerfer.
                                        Terry Pratchett, „Gevatter Tod“
                                    2. das urlencode ergibt sehr viele Zeichen, die mir aber so ohne weiteres nicht weiterhelfen. Vielleicht bitte ich sr-online doch noch mal auf Knien, sich einen rss-feed zuzulegen.

                                      Das htmlspecialchars hatte ich übrigens längst rausgenommen.

                                      1. Hallo

                                        das urlencode ergibt sehr viele Zeichen, die mir aber so ohne weiteres nicht weiterhelfen.

                                        Dann zeige sie doch endlich einmal her. Natürlich jeweils mit Angabe des Schrittes, nach dem genau diese Ausgabe erfolgte.

                                        Tschö, Auge

                                        --
                                        Es schimmerte ein Licht am Ende des Tunnels und es stammte von einem Flammenwerfer.
                                        Terry Pratchett, „Gevatter Tod“
                                        1. Hallo

                                          das urlencode ergibt sehr viele Zeichen, die mir aber so ohne weiteres nicht weiterhelfen.

                                          Dann zeige sie doch endlich einmal her. Natürlich jeweils mit Angabe des Schrittes, nach dem genau diese Ausgabe erfolgte.

                                          Das kommt bei echo URLENCODE, das direkt nach file_get_contents erfolgte:

                                          url: %3C%21--+quirks+mode+please+--%3E%0A%3C%3Fxml+version%3D%221.0%22+encoding%3D%22UTF-8%22%3F%3E%0A%3C%21DOCTYPE+html+PUBLIC+%22-%2F%2FW3C%2F%2FDTD+XHTML+1.0+Strict%2F%2FEN%22+%22http%3A%2F%2Fwww.w3.org%2FTR%2Fxhtml1%2FDTD%2Fxhtml1-strict.dtd%22%3E%0A%3C%21--+Bereichskonfiguration+ermitteln+%28erforderlich+f%C3%BCr+showBannerAlways+-+wenn+TRUE%2C%0Adann+auf+Folgeseiten+auch+den+Titel+ausspielen+%28f%C3%BCr+Nachritenseiten%29+--%3E%0A%3C%21--+bei+xRed+ist+das+Erstelldatum+bereits+im+Text%2C+deswegen+leer+lassen+--%3E%0A%3C%21--+............................................................++--%3E%0A%3Chtml+xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22+xml%3Alang%3D%22de%22+lang%3D%22de%22%3E%3Chead%3E%3C%21--%5Bif+IE+8%5D%3E%3Cmeta+http-equiv%3D%22X-UA-Compatible%22+content%3D%22IE%3DEmulateIE7%22+%2F%3E%3C%21%5Bendif%5D--%3E%3Cmeta+http-equiv%3D%22X-UA-Compatible%22+content%3D%22IE%3Dedge%2Cchrome%3D1%22+%2F%3E%3C%21--+baseURL%3A+%2Fsronline+--%3E%3Cmeta+content%3D%22text%2Fjavascript%22+http-equiv%3D%22Content-Script-Type%22%2F%3E%3Cmeta+content%3D%22Hoerfunknachrichten+Import%22+name%3D%22keywords%22%2F%3E%3Cmeta+content%3D%22Hoerfunknachrichten+Import%22+name%3D%22DC.Subject%22%2F%3E%3Cmeta+content%3D%22Berlin%3A+Bundestag+verabschiedet+IT-Sicherheitsgesetz%22+name%3D%22description%22%2F%3E%3Cmeta+content%3D%22Berlin%3A+Bundestag+verabschiedet+IT-Sicherheitsgesetz%22+name%3D%22DC.description%22%2F%3E%3Cmeta+content%3D%22Saarl%C3%A4ndischer+Rundfunk%22+name%3D%22DC.publisher%22%2F%3E%3Clink+href%3D%22%2Fsronline%2Fimages%2Ficons%2Ffavicon.ico%22+rel%3D%22shortcut+icon%22%2F%3E%3Clink+media%3D%22screen%2C+projection%2C+print%22+type%3D%22text%2Fcss%22+rel%3D%22stylesheet%22+href%3D%22%2Fsronline%2Fcss%2Fsronline.css%22%2F%3E%3C%21--%5Bif+IE%5D%3E%3Clink+media%3D%22screen%2C+projection%2C+print%22+type%3D%22text%2Fcss%22+rel%3D%22stylesheet%22+href%3D%22%2Fsronline%2Fcss%2Fsronline_ie.css%22%2F%3E%3C%21%5Bendif%5D--%3E%3C%21--%5Bif+lt+IE+6.0%5D%3E%3Clink+media%3D%22screen%2C+projection%2C+print%22+type%3D%22text%2Fcss%22+rel%3D%22stylesheet%22+href%3D%22%2Fsronline%2Fcss%2Fsronline_ie5.css%22%2F%3E%3C%21%5Bendif%5D--%3E%3C%21--%5Bif+IE+10%5D%3E%3Clink+media%3D%22screen%2C+projection%2C+print%22+type%3D%22text%2Fcss%22+rel%3D%22stylesheet%22+href%3D%22%2Fsronline%2Fcss%2Fsronline_ie10.css%22%2F%3E%3C%21%5Bendif%5D--%3E%3Clink+media%3D%22handheld%22+type%3D%22text%2Fcss%22+rel%3D%22stylesheet%22+href%3D%22%2Fsronline%2Fpda.css%22%2F%3E%3Cscript+src%3D%22%2Fsronline%2Fjs%2Fsronline.js%22+type%3D%22text%2Fjavascript%22%3E%3B%3C%2Fscript%3E%3Cscript+src%3D%22%2Fsronline%2Fjs%2Fhome.js%22+type%3D%22text%2Fjavascript%22%3E%3B%3C%2Fscript%3E%3Cscript+src%3D%22%2F%2Fscript.ioam.de%2Fiam.js%22+type%3D%22text%2Fjavascript%22%3E%3B%3C%2Fscript%3E%3Clink+media%3D%22screen%2C+projection%2C+print%22+type%3D%22text%2Fcss%22+rel%3D%22stylesheet%22+href%3D%22%2Fsronline%2Fcss%2Fnachrichten.css%22%2F%3E%3Ctitle%3ESR-online%3A+H%C3%B6rfunknachrichten%2C+12.06.2015+12%3A10+Uhr%3C%2Ftitle%3E%3C%2Fhead%3E%3Cbody%3E%3Cdiv+class%3D%22unsichtbar%22%3E%3Ch1%3EDirektanwahl+von+Seitenabschnitten%3C%2Fh1%3E%3Cul%3E%3Cli%3E%3Cdfn+class%3D%22unsichtbar%22%3E1.+%3C%2Fdfn%3E%3Ca+href%3D%22%23bereichsnavigation%22%3EWechsel+des+Hauptbereichs%3C%2Fa%3E%3Cspan+class%3D%22unsichtbar%22%3E.+%3C%2Fspan%3E%3C%2Fli%3E%3Cli%3E%3Cdfn+class%3D%22unsichtbar%22%3E2.+%3C%2Fdfn%3E%3Ca+href%3D%22%23navigation%22%3EMen%C3%BC+des+aktuellen+Hauptbereichs%3C%2Fa%3E%3Cspan+class%3D%22unsichtbar%22%3E.+%3C%2Fspan%3E%3C%2Fli%3E%3Cli%3E%3Cdfn+class%3D%22unsichtbar%22%3E3.+%3C%2Fdfn%3E%3Ca+href%3D%22%23inhalt%22%3ETextinhalt+dieser+Seite%3C%2Fa%3E%3Cspan+class%3D%22unsichtbar%22%3E.+%3C%2Fspan%3E%3C%2Fli%3E%3Cli%3E%3Cdfn+class%3D%22unsichtbar%22%3E4.+%3C%2Fdfn%3E%3Ca+href%3D%22%23rechte_spalte%22%3EAbschnitt+mit+Teasern%3C%2Fa%3E%3Cspan+class%3D%22unsichtbar%22%3E.+%3C%2Fspan%3E%3C%2Fli%3E%3C%2Ful%3E%3C%2Fdiv%3E%3Cdiv+id%3D%22rahmen1%22%3E%3Cdiv+id%3D%22oben_navi%22%3E%3Cul%3E%3Cli%3E%3Ca+title%3D%221.+SR-online.de+Startseite.%22+href%3D%22%2Fsronline%2Findex.html%22%3E%3Cimg+width%3D%22140%22+height%3D%2230%22+title%3D%221.+SR-online.%22+alt%3D%22SR-online%22+src%3D%22%2Fsronline%2Fimages%2Felement_oben_logo_sronline.gif%22%2F%3E%3C%2Fa%3E%3C%2Fli%3E%3Cli%3E%3Ca+name%3D%22bereichsnavigation%22%2F%3E%3Ca+title%3D%222.+Nachrichten.%22+href%3D%22%2Fsronline%2Fnachrichten%2Fuebersicht%2F%22%3E%3Cimg+width%3D%2281%22+height%3D%2218%22+title%3D%222.+Nachrichten.%22+alt%3D%22Nachrichten%22+src%3D%22%2Fsronline%2Fimages%2Felement_oben_navi_nachrichten_hi.gif%22%2F%3E%3C%2Fa%3E%3C%2Fli%3E%3Cli%3E%3Ca+title%3D%225.+Sport.%22+href%3D%22%2Fsronline%2Fsport%2Fuebersicht%2F%22%3E%3Cimg+width%3D%2240%22+height%3D%2218%22+title%3D%225.+Sport.%22+alt%3D%22Sport%22+src%3D%22%2Fsronline%2Fimages%2Felement_oben_navi_sport_lo.gif%22%2F%3E%3C%2Fa%3E%3C%2Fli%3E%3Cli%3E%3Ca+title%3D%223.+Kultur.%22+href%3D%22%2Fsronline%2Fkultur%2Fuebersicht%2F%22%3E%3Cimg+width%3D%2244%22+height%3D%2218%22+title%3D%223.+Kultur.%22+alt%3D%22Kultur%22+src%3D%22%2Fsronline%2Fimages%2Felement_oben_navi_kultur_lo.gif%22%2F%3E%3C%2Fa%3E%3C%2Fli%3E%3Cli%3E%3Ca+title%3D%224.+Land+%26+Leute.%22+href%3D%22%2Fsronline%2Fland_leute%2Fuebersicht%2F%22%3E%3Cimg+width%3D%2284%22+height%3D%2218%22+title%3D%224.+Land+%26+Leute.%22+alt%3D%22Land+%26+Leute%22+src%3D%22%2Fsronline%2Fimages%2Felement_oben_navi_landleute_lo.gif%22%2F%3E%3C%2Fa%3E%3C%2Fli%3E%3Cli%3E%3Ca+title%3D%226.+Wissen.%22+href%3D%22%2Fsronline%2Fwissen%2Ftipps_und_ratgeber%2F%22%3E%3Cimg+width%3D%2254%22+height%3D%2218%22+title%3D%226.+Wissen.%22+alt%3D%22Wissen%22+src%3D%22%2Fsronline%2Fimages%2Felement_oben_navi_ratgeber_lo.gif%22%2F%3E%3C%2Fa%3E%3C%2Fli%3E%3Cli%3E%3Ca+title%3D%2212.+DingXX.%22+href%3D%22%2Fsronline%2Fdingxx%2Fuebersicht%2F%22%3E%3Cimg+width%3D%2251%22+height%3D%2218%22+title%3D%2212.+DingXX.%22+alt%3D%22DingXX%22+src%3D%22%2Fsronline%2Fimages%2Felement_oben_navi_dingxx_lo.gif%22%2F%3E%3C%2Fa%3E%3C%2Fli%3E%3Cli%3E%3Ca+title%3D%227.+SR+Fernsehen.%22+href%3D%22%2Fsronline%2Fsr_fernsehen%2Fuebersicht%2Findex.html%22%3E%3Cimg+width%3D%2271%22+height%3D%2218%22+title%3D%227.+SR+Fernsehen.%22+alt%3D%22SR+Fernsehen%22+src%3D%22%2Fsronline%2Fimages%2Felement_oben_navi_fernsehen_lo.gif%22%2F%3E%3C%2Fa%3E%3C%2Fli%3E%3Cli%3E%3Ca+title%3D%228.+SR+1+Europawelle.%22+href%3D%22%2Fsronline%2Fsr1%2Fuebersicht%2F%22%3E%3Cimg+width%3D%2234%22+height%3D%2218%22+title%3D%228.+SR+1+Europawelle.%22+alt%3D%22SR+1+Europawelle%22+src%3D%22%2Fsronline%2Fimages%2Felement_oben_navi_sr1_lo.gif%22%2F%3E%3C%2Fa%3E%3C%2Fli%3E%3Cli%3E%3Ca+title%3D%229.+SR+2+KulturRadio.%22+href%3D%22%2Fsronline%2Fsr2%2Fuebersicht%2F%22%3E%3Cimg+width%3D%2234%22+height%3D%2218%22+title%3D%229.+SR+2+KulturRadio.%22+alt%3D%22SR+2+KulturRadio%22+src%3D%22%2Fsronline%2Fimages%2Felement_oben_navi_sr2_lo.gif%22%2F%3E%3C%2Fa%3E%3C%2Fli%3E%3Cli%3E%3Ca+title%3D%2210.+SR+3+Saarlandwelle.%22+href%3D%22%2Fsronline%2Fsr3%2Fuebersicht%2F%22%3E%3Cimg+width%3D%2235%22+height%3D%2218%22+title%3D%2210.+SR+3+Saarlandwelle.%22+alt%3D%22SR+3+Saarlandwelle%22+src%3D%22%2Fsronline%2Fimages%2Felement_oben_navi_sr3_lo.gif%22%2F%3E%3C%2Fa%3E%3C%2Fli%3E%3Cli%3E%3Ca+title%3D%2211.+Deutsche+Radiophilharmonie.%22+href%3D%22http%3A%2F%2Fwww.drp-orchester.de%22%3E%3Cimg+width%3D%2233%22+height%3D%2218%22+title%3D%2211.+Deutsche+Radiophilharmonie.%22+alt%3D%22Deutsche+Radiophilharmonie%22+src%3D%22%2Fsronline%2Fimages%2Felement_oben_navi_drp_lo.gif%22%2F%3E%3C%2Fa%3E%3C%2Fli%3E%3Cli%3E%3Ca+title%3D%2212.+Der+SR.%22+href%3D%22%2Fsronline%2Fder_sr%2Findex.html%22%3E%3Cimg+width%3D%2248%22+height%3D%2218%22+title%3D%2212.+Der+SR.%22+alt%3D%22Der+SR%22+src%3D%22%2Fsronline%2Fimages%2Felement_oben_navi_dersr_lo.gif%22%2F%3E%3C%2Fa%3E%3C%2Fli%3E%3C%2Ful%3E%3C%2Fdiv%3E%3Cdiv+id%3D%22oben%22%3E%3Cimg+src%3D%22%2Fsronline%2Fimages%2Felement_oben_kopfgrafik_nachrichten.jpg%22+alt%3D%22SR-online+Nachrichten%22+title%3D%22SR-online+Nachrichten%22+height%3D%2244%22+width%3D%22750%22+complete%3D%22complete%22+alt%3D%22SR-online+Startseite%22+title%3D%22SR-online+Startseite%22+height%3D%2244%22+width%3D%22750%22%2F%3E%3C%2Fdiv%3E%3Cdiv+id%3D%22obenzeile%22%3E%3Cul%3E%3Cli%3E%3Ca+title%3D%221.+Hilfe.%22+href%3D%22%2Fsronline%2Fder_sr%2Fa-z%2Findex.html%22%3E%3Cimg+width%3D%2223%22+height%3D%2213%22+title%3D%221.+Hilfe.%22+alt%3D%221.+Hilfe.%22+src%3D%22%2Fsronline%2Fimages%2Felement_oben_hilfe.gif%22%2F%3E%3C%2Fa%3E%3C%2Fli%3E%3Cli%3E%3Ca+title%3D%222.+Kontakt.%22+href%3D%22%2Fsronline%2Fder_sr%2Fkontakt%2Findex.html%22%3E%3Cimg+width%3D%2227%22+height%3D%2213%22+title%3D%222.+Kontakt.%22+alt%3D%222.+Kontakt.%22+src%3D%22%2Fsronline%2Fimages%2Felement_oben_kontakt.gif%22%2F%3E%3C%2Fa%3E%3C%2Fli%3E%3Cli%3E%3Ca+title%3D%223.+Impressum.%22+href%3D%22%2Fsronline%2Fder_sr%2Funternehmen%2Fimpressum%2Findex.html%22%3E%3Cimg+width%3D%2267%22+height%3D%2213%22+title%3D%223.+Impressum.%22+alt%3D%223.+Impressum.%22+src%3D%22%2Fsronline%2Fimages%2Felement_oben_impressum.gif%22%2F%3E%3C%2Fa%3E%3C%2Fli%3E%3C%2Ful%3E%3C%2Fdiv%3E%3Cdiv+id%3D%22rahmen2%22%3E%3Cdiv+id%3D%22rahmen3%22%3E%3Cdiv+class%3D%22spalte%22+id%3D%22links%22%3E%3Cdiv+id%3D%22links_dynamisch%22%3E%0A%3Ca+name%3D%22navigation%22%3E%3C%2Fa%3E%0A%3Cul+class%3D%22menue%22%3E%0A%3Cli+class%3D%22gewaehlt%22%3E%3Cdfn+class%3D%22unsichtbar%22%3E1.%3C%2Fdfn%3E%3Ca+href%3D%22%2Fsronline%2Fnachrichten%2Fuebersicht%2Findex.html%22%3E%C3%9Cbersicht%3C%2Fa%3E%3Cspan+class%3D%22unsichtbar%22%3E.+%3C%2Fspan%3E%3C%2Fli%3E%0A%3Cli+class%3D%22gewaehlt%22%3E%3Cspan+class%3D%22unsichtbar%22%3EGew%26auml%3Bhlt%3A+%3C%2Fspan%3E%3Cdfn+class%3D%22unsichtbar%22%3E2.%3C%2Fdfn%3E%3Ca+href%3D%22%2Fsronline%2Fnachrichten%2Fhoerfunknachrichten%2Findex.html%22%3EH%C3%B6rfunknachrichten%3C%2Fa%3E%3Cspan+class%3D%22unsichtbar%22%3E.+%3C%2Fspan%3E%3Cul+class%3D%22submenue%22%3E%0A%3Cli%3E%3Cdfn+class%3D%22unsichtbar%22%3E1.%3C%2Fdfn%3E%3Ca+href%3D%22%2Fsronline%2Fnachrichten%2Fhoerfunknachrichten%2Fredaktion%2Findex.html%22%3ERedaktion%3C%2Fa%3E%3Cspan+class%3D%22unsichtbar%22%3E.+%3C%2Fspan%3E%3C%2Fli%3E%0A%3Cli%3E%3Cdfn+class%3D%22unsichtbar%22%3E2.%3C%2Fdfn%3E%3Ca+href%3D%22%2Fsronline%2Fnachrichten%2Fhoerfunknachrichten%2Farchiv%2Findex.html%22%3EArchiv%3C%2Fa%3E%3Cspan+class%3D%22unsichtbar%22%3E.+%3C%2Fspan%3E%3C%2Fli%3E%0A%3C%2Ful%3E%0A%3C%2Fli%3E%0A%3Cli%3E%3Cdfn+class%3D%22unsichtbar%22%3E3.%3C%2Fdfn%3E%3Ca+href%3D%22%2Fsronline%2Fnachrichten%2Fregionalnachrichten%2Findex.html%22%3ERegionalnachrichten%3C%2Fa%3E%3Cspan+class%3D%22unsichtbar%22%3E.+%3C%2Fspan%3E%3C%2Fli%3E%0A%3Cli%3E%3Cdfn+class%3D%22unsichtbar%22%3E4.%3C%2Fdfn%3E%3Ca+href%3D%22%2Fsronline%2Fnachrichten%2Fpolitik_wirtschaft%2Findex.html%22%3EPolitik+%26+Wirtschaft%3C%2Fa%3E%3Cspan+class%3D%22unsichtbar%22%3E.+%3C%2Fspan%3E%3C%2Fli%3E%0A%3Cli%3E%3Cdfn+class%3D%22unsichtbar%22%3E5.%3C%2Fdfn%3E%3Ca+href%3D%22%2Fsronline%2Fnachrichten%2Fpanorama%2Findex.html%22%3EPanorama%3C%2Fa%3E%3Cspan+class%3D%22unsichtbar%22%3E.+%3C%2Fspan%3E%3C%2Fli%3E%0A%3Cli%3E%3Cdfn+class%3D%22unsichtbar%22%3E6.%3C%2Fdfn%3E%3Ca+href%3D%22%2Fsronline%2Fnachrichten%2Fdossiers%2Findex.html%22%3EDossiers%3C%2Fa%3E%3Cspan+class%3D%22unsichtbar%22%3E.+%3C%2Fspan%3E%3C%2Fli%3E%0A%3Cli%3E%3Cdfn+class%3D%22unsichtbar%22%3E7.%3C%2Fdfn%3E%3Ca+href%3D%22%2Fsronline%2Fnachrichten%2Fgewinnzahlen%2Findex.html%22%3EGewinnzahlen%3C%2Fa%3E%3Cspan+class%3D%22unsichtbar%22%3E.+%3C%2Fspan%3E%3C%2Fli%3E%0A%3Cli%3E%3Cdfn+class%3D%22unsichtbar%22%3E8.%3C%2Fdfn%3E%3Ca+href%3D%22%2Fsronline%2Fnachrichten%2Fwetter%2Findex.html%22%3EWetter%3C%2Fa%3E%3Cspan+class%3D%22unsichtbar%22%3E.+%3C%2Fspan%3E%3C%2Fli%3E%0A%3Cli%3E%3Cdfn+class%3D%22unsichtbar%22%3E9.%3C%2Fdfn%3E%3Ca+href%3D%22%2Fsronline%2Fnachrichten%2Fverkehr%2Findex.html%22%3EVerkehr%3C%2Fa%3E%3Cspan+class%3D%22unsichtbar%22%3E.+%3C%2Fspan%3E%3C%2Fli%3E%0A%3C%2Ful%3E%3C%2Fdiv%3E%3Cdiv+id%3D%22links_statisch%22%3E%0A%3Cul+class%3D%22menue%22%3E%0A%3Cli%3E%3Ca+title%3D

                                          1. Hallo

                                            Dann zeige sie doch endlich einmal her. Natürlich jeweils mit Angabe des Schrittes, nach dem genau diese Ausgabe erfolgte.

                                            Das kommt bei echo URLENCODE, das direkt nach file_get_contents erfolgte:

                                            Ok, ja und doch nein. Das ist der leider unvollständige Quelltext der ganzen Seite. Ich vermute, dass hier eine Größenbeschränkung der Postings im Forum zuschlägt. Der eigentliche (aktuelle (2015-06-12 13:29)) Nutzinhalt der in diesem Posting verlinkten Seite ist jedenfalls nicht zu finden. Dessen umlautlose Textteile sollten nicht von urlencode angefasst und deshalb mit der browsereigenen Suchfunktion auffindbar sein. Das sind sie aber nicht.

                                            Nocheinmal etwas anders. Du holst dir ja mit

                                            foreach ($xPath->query("//div[@class=\"mitte_folgeseiten\"]/ul/li/a") as $element) {
                                            

                                            oder ähnlichem einzelne Blöcke aus dem Quelltext. Kannst du bitte einen dieser Blöcke direkt nach der Extraktion aber noch vor der Weiterverarbeitung durch urlencode schicken und hier die Ausgabe posten? Damit sollten wir eher zu den relevanten Teilen vorstoßen.

                                            Tschö, Auge

                                            --
                                            Es schimmerte ein Licht am Ende des Tunnels und es stammte von einem Flammenwerfer.
                                            Terry Pratchett, „Gevatter Tod“
                                            1. Nocheinmal etwas anders. Du holst dir ja mit

                                              foreach ($xPath->query("//div[@class=\"mitte_folgeseiten\"]/ul/li/a") as $element) {
                                              

                                              oder ähnlichem einzelne Blöcke aus dem Quelltext. Kannst du bitte einen dieser Blöcke direkt nach der Extraktion aber noch vor der Weiterverarbeitung durch urlencode schicken und hier die Ausgabe posten? Damit sollten wir eher zu den relevanten Teilen vorstoßen.

                                              Hier habe ich es so gemacht, wie Du vorschlägst - zufällig ist es auch wieder ein Text mit den ominösen Anführungszeichen:

                                              url: Die+Stadtverwaltung+hat+die+Baugenehmigung+f%C3%83%C2%BCr+das+geplante+Gro%C3%83%C2%9Fbordell+im+V%C3%83%C2%B6lklinger+Stadtteil+Fenne+erteilt.%0AS%C3%83%C2%A4mtliche+Auflagen+seien+vom+Bauherr+erf%C3%83%C2%BCllt+worden.+Das+umstrittene+Bordell+soll+in+der+ehemaligen+%E2%80%9EGlash%C3%83%C2%BCttenhalle%E2%80%9C%E2%80%82entstehen.+Die+Pl%C3%83%C2%A4ne+hatten+heftige+Proteste+in+der+Bev%C3%83%C2%B6lkerung+ausgel%C3%83%C2%B6st.%0ANach+Angaben+der+Stadt+wurde+letztlich+nur+ein+Tagesbordell+mit+41+Zimmern+genehmigt.+Der+Betrieb+ist+damit+nur+zwischen+6+bis+22+Uhr+erlaubt.+Ursp%C3%83%C2%BCnglich+waren+60+Zimmer+vorgesehen.%0AOberb%C3%83%C2%BCrgermeister+Lorig+sagte+dem+SR%2C+man+habe+das+Vorhaben+nur+verz%C3%83%C2%B6gern%2C+rechtlich+aber+nicht+verhindern+k%C3%83%C2%B6nnen.%0A
                                              

                                              Ausgegeben wird das bei mir mit utf8_decode:

                                              Die Stadtverwaltung hat die Baugenehmigung für das geplante Großbordell im Völklinger Stadtteil Fenne erteilt. Sämtliche Auflagen seien vom Bauherr erfüllt worden. Das umstrittene Bordell soll in der ehemaligen ?Glashüttenhalle??entstehen. Die Pläne hatten heftige Proteste in der Bevölkerung ausgelöst. Nach Angaben der Stadt wurde letztlich nur ein Tagesbordell mit 41 Zimmern genehmigt. Der Betrieb ist damit nur zwischen 6 bis 22 Uhr erlaubt. Urspünglich waren 60 Zimmer vorgesehen. Oberbürgermeister Lorig sagte dem SR, man habe das Vorhaben nur verzögern, rechtlich aber nicht verhindern können.

                                              Ohne utf8_decode:

                                              Die Stadtverwaltung hat die Baugenehmigung für das geplante Großbordell im Völklinger Stadtteil Fenne erteilt. Sämtliche Auflagen seien vom Bauherr erfüllt worden. Das umstrittene Bordell soll in der ehemaligen „Glashüttenhalle“ entstehen. Die Pläne hatten heftige Proteste in der Bevölkerung ausgelöst. Nach Angaben der Stadt wurde letztlich nur ein Tagesbordell mit 41 Zimmern genehmigt. Der Betrieb ist damit nur zwischen 6 bis 22 Uhr erlaubt. Urspünglich waren 60 Zimmer vorgesehen. Oberbürgermeister Lorig sagte dem SR, man habe das Vorhaben nur verzögern, rechtlich aber nicht verhindern können.

                                              1. Hallo

                                                Kannst du bitte einen dieser Blöcke direkt nach der Extraktion aber noch vor der Weiterverarbeitung durch urlencode schicken und hier die Ausgabe posten? Damit sollten wir eher zu den relevanten Teilen vorstoßen.

                                                Hier habe ich es so gemacht, wie Du vorschlägst - zufällig ist es auch wieder ein Text mit den ominösen Anführungszeichen:

                                                url: Die+Stadtverwaltung+hat+die+Baugenehmigung+f%C3%83%C2%BCr+das+geplante+Gro%C3%83%C2%9Fbordell …
                                                

                                                So, da z.B. das „ü“ im Wort „für“ in zwei Bytes (%C3%83 und %C2%BC) kodiert wurde, konstatieren wir, dass der Text bei dir UTF-8-kodiert ankommt.

                                                Ausgegeben wird das bei mir mit utf8_decode:

                                                Die Stadtverwaltung hat die Baugenehmigung für das geplante Großbordell …

                                                Ohne utf8_decode:

                                                Die Stadtverwaltung hat die Baugenehmigung für das geplante Großbordell …

                                                Das bestätigt die Vermutung einiger, dass hier irgendwo auf deiner Seite etwas schief läuft. Die Seite wird offensichtlich ISO-8859-1- statt UTF-8-kodiert ausgeliefert, sonst wäre der mit utf8_decode behandelte Text verstümmelt und der UTF-8-kodierte Text nicht.

                                                Deshalb noch ein paar Fragen?

                                                1. Ist dein PHP-Skript selbst UTF-8-kodiert?
                                                2. Hast du schon mal nach dem Wert für default_charset in der Ausgabe der Funktion php_info geschaut?
                                                3. Ist der Quelltext, den du hier gezeigt hast, vollständig oder sind da Teile, z.B. mit Stringfunktionen, die du hier weggelassen hast?
                                                4. Hast du in der PHP-Dokumentation für die von dir benutzten Funktionen nach eventuell vorhandenen Parametern für die Zeichenkodierung geschaut?

                                                Tschö, Auge

                                                --
                                                Es schimmerte ein Licht am Ende des Tunnels und es stammte von einem Flammenwerfer.
                                                Terry Pratchett, „Gevatter Tod“
                                                1. Das bestätigt die Vermutung einiger, dass hier irgendwo auf deiner Seite etwas schief läuft. Die Seite wird offensichtlich ISO-8859-1- statt UTF-8-kodiert ausgeliefert, sonst wäre der mit utf8_decode behandelte Text verstümmelt und der UTF-8-kodierte Text nicht.

                                                  Deshalb noch ein paar Fragen?

                                                  1. Ist dein PHP-Skript selbst UTF-8-kodiert?
                                                  2. Hast du schon mal nach dem Wert für default_charset in der Ausgabe der Funktion php_info geschaut?
                                                  3. Ist der Quelltext, den du hier gezeigt hast, vollständig oder sind da Teile, z.B. mit Stringfunktionen, die du hier weggelassen hast?
                                                  4. Hast du in der PHP-Dokumentation für die von dir benutzten Funktionen nach eventuell vorhandenen Parametern für die Zeichenkodierung geschaut?
                                                  1. ja, ich habe es nach den ersten Kommentaren hier noch mal in den editor geladen und als utf8 ohne BOM abgespeichert und hochgeladen.

                                                  2. default_charset ist utf8. siehe Linkbeschreibung

                                                  3. Der Quelltext ist vollständig, das sieht jetzt in der php-Datei so aus:

                                                  <div class="border"><a href="http://www.sr-online.de/sronline/nachrichten/hoerfunknachrichten/index.html" target='_blank'> 
                                                  <img src="logos/sron.jpg" alt="Saarl&auml;ndischer Rundfunk" title= "Quelle: SR" style=" margin:3px 0px 5px -45px ; padding:0px;"/></a>
                                                  <ul><?php 
                                                  
                                                  $data = file_get_contents('http://www.sr-online.de/sronline/nachrichten/hoerfunknachrichten/hoerfunknachrichten_aktuell100~_seite-4.html');
                                                  
                                                  
                                                  $doc = new DOMDocument();
                                                  $doc->loadHTML($data);
                                                  
                                                  
                                                  $xPath = new DOMXPath($doc);
                                                  foreach ($xPath->query('//div/p') as $node2) {
                                                  
                                                  if (($zaehler <= 10)&& ($node2->nodeValue !== '') && ($node2->nodeValue !== NULL)){
                                                  
                                                  echo "url: " . urlencode($node2->nodeValue);
                                                  
                                                  
                                                  
                                                  }
                                                  }
                                                  ?></ul> </div>    
                                                  
                                                  
                                                  1. das ist der komplette Code, weitere Funktionen benutze ich nicht.

                                                  @edit: Inzwischen ist bei sr-online ein andere Meldung vorhanden, deshalb steht auf der Seite nicht mehr die "Bordell"-Meldung von vorhin mit den Anführungszeichen.

                                                  1. Hallo,

                                                    1. Der Quelltext ist vollständig, das sieht jetzt in der php-Datei so aus:
                                                    <div class="border"><a href="http://www.sr-online.de/sronline/nachrichten/hoerfunknachrichten/index.html" target='_blank'> 
                                                    <img src="logos/sron.jpg" alt="Saarl&auml;ndischer Rundfunk" title= "Quelle: SR" style=" margin:3px 0px 5px -45px ; padding:0px;"/></a>
                                                    <ul>
                                                    <?php 
                                                    
                                                    $data = file_get_contents('http://www.sr-online.de/sronline/nachrichten/hoerfunknachrichten/hoerfunknachrichten_aktuell100~_seite-4.html');
                                                    
                                                    
                                                    $doc = new DOMDocument();
                                                    $doc->loadHTML($data);
                                                    
                                                    
                                                    $xPath = new DOMXPath($doc);
                                                    foreach ($xPath->query('//div/p') as $node2) {
                                                    
                                                    if (($zaehler <= 10)&& ($node2->nodeValue !== '') && ($node2->nodeValue !== NULL)){
                                                    
                                                    echo "url: " . urlencode($node2->nodeValue);
                                                    
                                                    
                                                    
                                                    }
                                                    }
                                                    ?>
                                                    </ul> </div>    
                                                    

                                                    Nur eine ganz blöde Idee: Hast Du mal ausprobiert was passiert, wenn Du für das geparste Dokument die Kodierung angibst?

                                                    $doc = new DOMDocument('1.0', 'utf-8');
                                                    

                                                    utf-8 sollte zwar eigentlich laut Doku die Defaulteinstellung sein, man weiß bei PHP aber nie :-O

                                                    Grüße
                                                    TS

                                                    1. Hallo,

                                                      ich konnte es nicht mehr mit ansehen und habe mal eben selber gespielt. Da ich in meinem Tool, dass ich gerade bearbeite, nur drei Zeilen ändern musste, war das nicht schwer :-)

                                                      Zuvor habe ich die Daten von SR überprüft. An denen lag es nicht!
                                                      Es liegt an DOMDocument.

                                                      bitte ändere entsprechend und schau nochmal: (ob $dom oder $doc ist natürlich egal)

                                                      	$dom = new DOMDocument('1.0', 'utf-8');
                                                      	$dom->encoding = 'utf-8';
                                                      	$dom->validateOnParse = TRUE;
                                                      	$dom->strictErrorChecking = true ;
                                                      	$dom->preserveWhiteSpace = true;
                                                      
                                                      	$dom->loadXML($page);
                                                      

                                                      Ich habe keinen Kodierungsfehler mehr gefunden.
                                                      Nun hoffe ich, dass ich die nicht nur übersehen habe. Ich zieh schon mal den Kopf ein ;-)

                                                      Du lädst die Seite als HTML in den Parser, sie ist aber als XML deklaiert. Das scheint der Klasse nicht zu schmecken.

                                                      Grüße
                                                      TS

                                                      1. Hallo,

                                                        ich konnte es nicht mehr mit ansehen und habe mal eben selber gespielt. Da ich in meinem Tool, dass ich gerade bearbeite, nur drei Zeilen ändern musste, war das nicht schwer :-)

                                                        Zuvor habe ich die Daten von SR überprüft. An denen lag es nicht!
                                                        Es liegt an DOMDocument.

                                                        bitte ändere entsprechend und schau nochmal: (ob $dom oder $doc ist natürlich egal)

                                                        	$dom = new DOMDocument('1.0', 'utf-8');
                                                        	$dom->encoding = 'utf-8';
                                                        	$dom->validateOnParse = TRUE;
                                                        	$dom->strictErrorChecking = true ;
                                                        	$dom->preserveWhiteSpace = true;
                                                        
                                                        	$dom->loadXML($page);
                                                        

                                                        mal dumm gefragt: und dann so weiter:

                                                        $xPath = new DOMXPath($doc);
                                                        foreach ($xPath->query('//div/p') as $node2) {
                                                        if (($zaehler <= 10)&& ($node2->nodeValue !== '') && ($node2->nodeValue !== NULL)){
                                                        $array[$zaehler] = $node2->nodeValue;
                                                        $zaehler++;
                                                        
                                                        1. Hallo,

                                                          mal dumm gefragt: und dann so weiter:

                                                          Nee, das war auch noch falsch. Ich hatte mich verguckt und schon richtig Beulen am Kofp ;-O

                                                          Aber nun habe ich eine Schmuddellösung gefunden, mit der es klappt.

                                                          siehe http://forum.selfhtml.org/self/2015/jun/11/htmlentities-bereinigen/1642887#m1642887

                                                          Grüße
                                                          TS

                                                      2. Tach!

                                                        	$dom = new DOMDocument('1.0', 'utf-8');
                                                        	$dom->encoding = 'utf-8';
                                                        	$dom->validateOnParse = TRUE;
                                                        	$dom->strictErrorChecking = true ;
                                                        	$dom->preserveWhiteSpace = true;
                                                        
                                                        	$dom->loadXML($page);
                                                        

                                                        Damit bekomme ich nur einen Haufen XML-Parser-Fehler.

                                                        Du lädst die Seite als HTML in den Parser, sie ist aber als XML deklaiert. Das scheint der Klasse nicht zu schmecken.

                                                        Ich kann die Seite nur mit loadHTML() laden. Und da hat eine Änderung der Konstruktorparameter von DOMDocument nichts gebracht. Das Handbuch verrät in den User-Kommentaren, dass loadHTML() ISO-8859-1 erwartet. (Meine Erfahrung hatte was von UTF-8 abgespeichert, aber das war dann wohl eine andere Situation.) Ein Trick wäre wohl die Kodierung als XML-Vorspann voranzustellen.

                                                        $doc->loadHTML('<?xml encoding="UTF-8">' . $data);

                                                        Damit sah die Ausgabe gut aus. Anführungszeichen waren aber leider grad keine verfügbar.

                                                        dedlfix.

                                                    2. Nur eine ganz blöde Idee: Hast Du mal ausprobiert was passiert, wenn Du für das geparste Dokument die Kodierung angibst?

                                                      $doc = new DOMDocument('1.0', 'utf-8');
                                                      

                                                      utf-8 sollte zwar eigentlich laut Doku die Defaulteinstellung sein, man weiß bei PHP aber nie :-O

                                                      ja, habe ich versucht, änderte nichts.

                                                      1. Hallo nochmal,

                                                        Nur eine ganz blöde Idee: Hast Du mal ausprobiert was passiert, wenn Du für das geparste Dokument die Kodierung angibst?

                                                        $doc = new DOMDocument('1.0', 'utf-8');
                                                        

                                                        utf-8 sollte zwar eigentlich laut Doku die Defaulteinstellung sein, man weiß bei PHP aber nie :-O

                                                        ja, habe ich versucht, änderte nichts.

                                                        dann schau bitte jetzt hier: http://forum.selfhtml.org/self/2015/jun/11/htmlentities-bereinigen/1642871#m1642871.

                                                        Das scheint zu wirken.

                                                        Und es sit schwer, ein Posting im Thread wiederzufinden, wenn Ihr die Betreffzeile nicht entsprechend anpasst. Diese Faulheit ist eine Unsitte hier!

                                                        Und ich beantrage den Tag: "Lösung", der dann in Grün angezeigt wird ;-)

                                                        Grüße
                                                        TS

                                                        1. Tach!

                                                          Und ich beantrage den Tag: "Lösung", der dann in Grün angezeigt wird ;-)

                                                          Brauchen wir nicht, gekennzeichnete Lösungen werden beim Ausgangsposting gesondert angezeigt.

                                                          dedlfix.

                                                          1. Hallo,

                                                            ich hab natürlich den Kopf noch möchtig eingezogen... Hatte nämlich übersehen, dass ich statt der geparsten Links die Originalseite ausgegeben hatte. Und die war ja in Ordnung.

                                                            Aber: DOMDocument hat eine Macke, die man per Schmuddellösung umschiffen kann:

                                                            
                                                            $dom->loadHTML('<meta http-equiv="content-type" content="text/html; charset=utf-8">' . $page);
                                                            
                                                            

                                                            Das gibt zwar einen Parsing-Error, aber nun stimmt die Ausgabe. tztz.

                                                            Ich teste jetzt mal, ob man diese Zeile nicht an der passenden Stelle ins Dokument stanzen kann. Da aber die SROnline-Seite ohnehin ca. 40 Parsing-Fehler produziert, ist das eigentlich auch egal.

                                                            Bitte um Rückmeldung

                                                            Grüße
                                                            TS

                                                            1. Hallo,

                                                              ganz grob geht das jetzt so:

                                                              <?php 
                                                              
                                                              header('Content-Type: text/html; CharSet="utf-8">');
                                                              
                                                              
                                                              $page = file_get_contents('http://www.sr-online.de/sronline/nachrichten/hoerfunknachrichten/hoerfunknachrichten_aktuell100~_seite-4.html');
                                                              #file_put_contents('sr-online.de.html', $page);
                                                              
                                                              
                                                              	$dom = new DOMDocument('1.0', 'utf-8');
                                                              	$dom->encoding = 'utf-8';
                                                              	$dom->validateOnParse = TRUE;
                                                              	$dom->strictErrorChecking = true ;
                                                              	$dom->preserveWhiteSpace = true;
                                                              	$dom->resolveExternals = true;
                                                              
                                                              	$dom->loadHTML('<meta http-equiv="content-type" content="text/html; charset=utf-8">' . $page);
                                                              	
                                                              	$node = $dom->getElementById('mitte_text');
                                                              	
                                                                  $text = $dom->saveHTML($node);
                                                              	
                                                              
                                                              ?>
                                                              <!DOCTYPE HTML>
                                                              <html lang="de">
                                                              
                                                              <head>
                                                              	<title>SR-Online</title>
                                                              </head>
                                                              <body>
                                                              	<pre>
                                                              <?php echo $text; ?>
                                                              	</pre>
                                                              </body>
                                                              </html>
                                                              
                                                              

                                                              Müssen noch die Warnings abgefangen werden. Siehe mein Thread dazu.
                                                              Und besser wäre es, den Meta-Tag an einer passenden Stelle im Dokument zu platzieren...

                                                              Grüße
                                                              TS

                                                              1. Hallo,

                                                                wennm man erst weiß, wo es kneift, dann findet man die Lösung überall im Internet, auch in den UCN von PHP:
                                                                http://php.net/manual/de/domdocument.loadhtml.php -> bigtree

                                                                Es ist mir nie aufgefallen, dass die Meta-Angabe

                                                                <meta http-equiv="content-type" content="text/html; charset=utf-8">
                                                                

                                                                für die DOMDocument-Klasse zum Verarbeiten von HTML in anderen Kodierungen, als ISO-8859-1 notwendig ist, weil ich die in meinen Testdokumenten drinstehen habe oder die untersuchten Fremdseiten immer in ISO-8859-1 waren.

                                                                Und um Gunnar gleich vorzugreifen: Das folgende reicht der DOMDocument-Klasse leider nicht.
                                                                Ein sauber aufgebautes HTML-5-Dokument wird also nur mit der antiquierten Meta-Angabe sauber geparst. Es ist und bleibt eben PHP (plastered home production) :-P

                                                                <meta charset="utf-8">
                                                                

                                                                Grüße
                                                                TS

                                                                1. Hallo,

                                                                  ich will das noch mal etwas verbiegen. Inwzwischen wisse wir, dass:

                                                                  wennm man erst weiß, wo es kneift, dann findet man die Lösung überall im Internet, auch in den UCN von PHP:
                                                                  http://php.net/manual/de/domdocument.loadhtml.php -> bigtree

                                                                  Es ist mir nie aufgefallen, dass die Meta-Angabe

                                                                  <meta http-equiv="content-type" content="text/html; charset=utf-8">
                                                                  

                                                                  für die DOMDocument-Klasse zum Verarbeiten von HTML in anderen Kodierungen, als ISO-8859-1 notwendig ist, weil ich die in meinen Testdokumenten drinstehen habe oder die untersuchten Fremdseiten immer in ISO-8859-1 waren.

                                                                  Und um Gunnar gleich vorzugreifen: Das folgende reicht der DOMDocument-Klasse leider nicht.
                                                                  Ein sauber aufgebautes HTML-5-Dokument wird also nur mit der antiquierten Meta-Angabe sauber geparst. Es ist und bleibt eben PHP (plastered home production) :-P

                                                                  <meta charset="utf-8">
                                                                  

                                                                  aber eine Angabe von

                                                                  <?xml encoding="UTF-8" ?>
                                                                  

                                                                  die man dem Dokument voranstellt (bisher gilt: wirklich als erste Zeile!), die DomDocument-Classes dazu bewegen, dass ihr HTML-Parser in der Kodierung UTF-8 arbeitet.

                                                                  Wenn man dies mittels PHP angeben will, sollte man sicherheitshalber die folgende Kostruktion wählen:

                                                                  ## [...]
                                                                  $page = file_get_contents($url);
                                                                  $meta = '<' . '?xml encoding="UTF-8" ?' . ">\r\n";  
                                                                  $dom = new DOMDocument('1.0', 'utf-8');
                                                                  $dom->loadHTML($meta . $page);
                                                                  

                                                                  wegen der eventuell eingeschalteten Short-Open-Tags. Aber auch bei ausgeschalteten Short-Open-Tags kotzen manche PHP Verionen noch ab, wenn eine derarige Zeile "<?xml ... ?>" auskommentiert im Dokument steht. Das "?>" scheint da trotzdem zu stören.

                                                                  Grüße
                                                                  TS

                                                                  1. Tach!

                                                                    $meta = '<' . '?xml encoding="UTF-8" ?' . ">\r\n";  
                                                                    

                                                                    wegen der eventuell eingeschalteten Short-Open-Tags. Aber auch bei ausgeschalteten Short-Open-Tags kotzen manche PHP Verionen noch ab, wenn eine derarige Zeile "<?xml ... ?>" auskommentiert im Dokument steht. Das "?>" scheint da trotzdem zu stören.

                                                                    Das <? innerhalb eines String-Literals macht keine Probleme. Das muss nicht auseinandergenommen werden. Das ?> ist ebenfalls innerhalb eines Strings problemfrei. Allerdings verliert das String-Literal und alle andere Syntax beim Auskommentieren seine Bedeutung. Ein einzeiliger Kommentar (// oder #) endet nicht nur am Zeilenende, sondern auch an einem ?> in der Zeile. Ein mehrzeiliger (/* */) allerdings lässt sich nicht durch ein ?> aus der Ruhe bringen. Das ?> ist also nur für den Fall erforderlich, dass man die Zeile einzeilig auskommentieren möchte. Für den normalen Betrieb kann man alles beides einfach so zusammenschreiben.

                                                                    dedlfix.

                                                                    1. Tach!

                                                                      $meta = '<' . '?xml encoding="UTF-8" ?' . ">\r\n";  
                                                                      

                                                                      wegen der eventuell eingeschalteten Short-Open-Tags. Aber auch bei ausgeschalteten Short-Open-Tags kotzen manche PHP Verionen noch ab, wenn eine derarige Zeile "<?xml ... ?>" auskommentiert im Dokument steht. Das "?>" scheint da trotzdem zu stören.

                                                                      Das <? innerhalb eines String-Literals macht keine Probleme. Das muss nicht auseinandergenommen werden. Das ?> ist ebenfalls innerhalb eines Strings problemfrei. Allerdings verliert das String-Literal und alle andere Syntax beim Auskommentieren seine Bedeutung. Ein einzeiliger Kommentar (// oder #) endet nicht nur am Zeilenende, sondern auch an einem ?> in der Zeile. Ein mehrzeiliger (/* */) allerdings lässt sich nicht durch ein ?> aus der Ruhe bringen. Das ?> ist also nur für den Fall erforderlich, dass man die Zeile einzeilig auskommentieren möchte. Für den normalen Betrieb kann man alles beides einfach so zusammenschreiben.

                                                                      Danke für die Erleuchtung.

                                                                      Ich hatte mir angewöhnt, das "?>" immer (ähem) auseinanderzunehmen. Eben hatte ich nicht getan im Bastelscript und bin sofort damit auf die Schnauze gefallen.

                                                                      Man bricht sich keinen ab, wenn man es sicherheitshalber immer auseinander nimmt.

                                                                      Grüße
                                                                      TS

                                                            2. Hallo,

                                                              DOMDocument hat eine Macke, die man per Schmuddellösung umschiffen kann:
                                                              Bereits beim Laden des Dokumentes muss die passende Kodierung genau mit diesem <meta>-Tag (dem antiquierten aus HTML4.1) als erster Tag dieser Art angebeben werden. Das geht schmuddelig, in dem man ihn einfach "deplaced" vor das Dokument schaltet.

                                                              
                                                              $dom->loadHTML('<meta http-equiv="content-type" content="text/html; charset=utf-8">' . $page);
                                                              
                                                              

                                                              Das gibt zwar einen Parsing-Error, aber nun stimmt die Ausgabe. tztz.

                                                              Ich teste jetzt mal, ob man diese Zeile nicht an der passenden Stelle ins Dokument stanzen kann. Da aber die SROnline-Seite ohnehin ca. 40 Parsing-Fehler produziert, ist das eigentlich auch egal.

                                                              Wenn man ihn an eine passende Stelle verfrachten will (also direkt hinter dem <head> Opener-Tag), dann muss man entweder sehr viel Aufwand treiben, oder aber sich an dieser Stelle auf RegEx verlassen, also den <head ???>-Tag suchen und ersetzen durch "<head ???><meta ...>".

                                                              Mit Aufwand habe ich es auch durchgeführt. Die Vorgehensweise sieht dann folgendermaßen aus:

                                                              • Meta-Tag als Musterdatei ablegen. Das ist einfacher, als die Node generisch zu basteln
                                                              • Meta Muster in ein eigenes Dokument laden und die <meta>-Node suchen
                                                                $metanode = $metadom->getElementsByTagName('meta')->item(0); 
                                                              ## oder wenn man ihr sinnvollerweise eine ID verpasst hat:
                                                                $metanode = $metadom->getElementByID('meta_utf8'); 
                                                              
                                                              • prüfen, ob $metanode wirklich geladen ist, also ungleich NULL!

                                                              • Originaldokument laden

                                                              • Meta-Node importierern

                                                              • importierte Meta-Node hinter dem <head>-Element plazieren

                                                                  $newMeta = $dom->importNode($metanode);
                                                                  $dom->getElementsByTagName('head')->item(0)->insertBefore($newMeta, $dom->getElementsByTagName('head')->item(0)->firstChild);	
                                                              
                                                              • Dokument mit $dom->saveHTML($var) wegschreiben in eine Variable
                                                              • Dokument erneut einlesen mit $dom->loadHTML($var);
                                                                die alte Instanz kann man dann getrost überschreiben damit.

                                                              Leider wird nur so das Dokument neu geparst, was (ich habe es ausprobiert) notwendig ist, damit sich die neue <meta>-Angabe für die Kodierung auswirkt.

                                                              ganz schon schmuddelig

                                                              Es erscheint mir daher legitim, an dieser Stelle eine RegEx-Lösung zu wählen für das Auffinden des <head ???>-Opener-Tags, oder sich in diesem Spezialfall einfach darauf zu verlassen, dass dort nur "<head>" steht. Das kann man dann einfach mit str_replace() ersetzen.

                                                              $meta = '<meta http-equiv="content-type" content="text/html; charset=utf-8">' ."\r\n";
                                                              
                                                              if (strpos($page, '<head>') !== false)
                                                              {
                                                              	$page = str_replace('<head>', "<head>\r\n$meta", $page);
                                                              	$meta = '';
                                                              }	
                                                              

                                                              Grüße
                                                              TS

                                                              1. Tach!

                                                                DOMDocument hat eine Macke, die man per Schmuddellösung umschiffen kann:
                                                                Bereits beim Laden des Dokumentes muss die passende Kodierung genau mit diesem <meta>-Tag (dem antiquierten aus HTML4.1) als erster Tag dieser Art angebeben werden. Das geht schmuddelig, in dem man ihn einfach "deplaced" vor das Dokument schaltet.

                                                                Was hast du denn dagegen, einen XML-Vorspann zu nehmen? Den kann man völlig unkompliziert und undeplatziert an den Anfang des Dokuments packen.

                                                                dedlfix.

                                                                1. Guten Morgen Dedlfix,

                                                                  DOMDocument hat eine Macke, die man per Schmuddellösung umschiffen kann:
                                                                  Bereits beim Laden des Dokumentes muss die passende Kodierung genau mit diesem <meta>-Tag (dem antiquierten aus HTML4.1) als erster Tag dieser Art angebeben werden. Das geht schmuddelig, in dem man ihn einfach "deplaced" vor das Dokument schaltet.

                                                                  Was hast du denn dagegen, einen XML-Vorspann zu nehmen? Den kann man völlig unkompliziert und undeplatziert an den Anfang des Dokuments packen.

                                                                  Hast Du das auch ausprobiert damit? Wie müsste der denn dMn aussehen? Das SR-Dokument hat diesen davor:

                                                                  <?xml version="1.0" encoding="UTF-8"?>
                                                                  

                                                                  Und damit ist die DOMDocument-Class nicht zufrieden.

                                                                  Wenn der anders aussehen muss oder darf, gib mir doch bitte mal ein Muster, dann probiere ich das nochmal aus. Ich bin aber relativ sicher, dass es nur mit dem Antik-Meta-Header aus HTML 4.01 funktioniert.

                                                                  Grüße
                                                                  TS

                                                                  1. Tach!

                                                                    Was hast du denn dagegen, einen XML-Vorspann zu nehmen? Den kann man völlig unkompliziert und undeplatziert an den Anfang des Dokuments packen.

                                                                    Hast Du das auch ausprobiert damit?

                                                                    Ja.

                                                                    Wie müsste der denn dMn aussehen?
                                                                    Das SR-Dokument hat diesen davor:

                                                                    <?xml version="1.0" encoding="UTF-8"?>
                                                                    

                                                                    Genau so. Die Versionsangabe kann man aber auch weglassen, encoding muss bleiben.

                                                                    Und damit ist die DOMDocument-Class nicht zufrieden.

                                                                    Der SR hat ja auch noch einen Kommentar davor. Damit wird anscheinend ein nachfolgender XML-Vorspann ignoriert.

                                                                    dedlfix.

                                                                    1. Nochmal Tach :-)

                                                                      Was hast du denn dagegen, einen XML-Vorspann zu nehmen? Den kann man völlig unkompliziert und undeplatziert an den Anfang des Dokuments packen.

                                                                      Hast Du das auch ausprobiert damit?

                                                                      Ja.

                                                                      Hab ich übersehen. Da war ich wohl gerade damit beschäftigt, die anderen Lösungsideen durchzuprobieren. Siehste: hättest Du das Betreff geändert, wäre das nicht passiert ;-)

                                                                      Wie müsste der denn dMn aussehen?
                                                                      Das SR-Dokument hat diesen davor:

                                                                      <?xml version="1.0" encoding="UTF-8"?>
                                                                      

                                                                      Genau so. Die Versionsangabe kann man aber auch weglassen, encoding muss bleiben.

                                                                      Und damit ist die DOMDocument-Class nicht zufrieden.

                                                                      Der SR hat ja auch noch einen Kommentar davor. Damit wird anscheinend ein nachfolgender XML-Vorspann ignoriert.

                                                                      Ja, sieht so aus. Ich habe die Versionen nochmal durchprobiert.

                                                                      Das Voranstellen von

                                                                        <?xml encoding="UTF-8"?>
                                                                      

                                                                      hat den Vorteil, dass das auch keinen Parserfehler im DOMDocument verursacht, auch dann nicht, wenn die Angabe später nochmal erfolgt. Damit erübrigt sich ja das Reinstanzen einer Angabe direkt hinter dem <head>.

                                                                      Kommt sofort in meine Sammlung.

                                                                      Abschließende Frage dazu:
                                                                      Wie sieht es mit der XML-Konformität des Dokumentes aus? Wenn man sich irgendwo ein (HTML 5-)Dokument beschafft, feststellt dass es vermeintlich UTF-8-codiert ist, darf man doch nicht einfach einen XML-Tag voranstellen, oder? Da steige ich nun noch nicht so ganz durch.

                                                                      Grüße
                                                                      TS

                                                                      1. Tach!

                                                                        Hab ich übersehen. Da war ich wohl gerade damit beschäftigt, die anderen Lösungsideen durchzuprobieren. Siehste: hättest Du das Betreff geändert, wäre das nicht passiert ;-)

                                                                        Du könntest dich registrieren. Dazu werden keinerlei persönliche Daten benötigt, nur eine Email-Adresse. Der Vorteil ist aber, dass du die Übersicht behältst, weil dann serverseitig die gelesenen Postings gekennzeichnet werden können. Damit entgeht dir nichts mehr.

                                                                        Abschließende Frage dazu:
                                                                        Wie sieht es mit der XML-Konformität des Dokumentes aus? Wenn man sich irgendwo ein (HTML 5-)Dokument beschafft, feststellt dass es vermeintlich UTF-8-codiert ist, darf man doch nicht einfach einen XML-Tag voranstellen, oder? Da steige ich nun noch nicht so ganz durch.

                                                                        Die XML-Konformität ist nicht relevant, wenn du den HTML-Parser nimmst. Der ist ausreichend fehlertolerant.

                                                                        dedlfix.

                                                                        1. Hallo, Vielen Dank für Eure Mühe. Ihr seid hoffentlich nicht böse, dass ich als Laie den Überblick verliere. Ich werde jetzt mal die Lösung unter "Kurzfassung" ausprobieren, auch wenn ich sie noch nicht verstehe. Ich hatte auch im Quelletext von sr-online gesehen, dass die HTML - Seite als XML definiert wird und mich gewundert. Nach meiner Einschätzung hat der sr anscheinend nicht nur kein Geld für einen ordentlichen rss-feed, sondern auch keines für eine ordentlich homepage.

                                                                          Wie gesagt, Danke, mal gucken ob ich die "Kurzfassung" einbauen kann, so wie ich es brauche.

                                                                          Glupto

                                                                          1. Hallo zurück,

                                                                            Hallo, Vielen Dank für Eure Mühe. Ihr seid hoffentlich nicht böse, dass ich als Laie den Überblick verliere.

                                                                            Das geht auch leicht bei dieser Klasse und den Rahmenbedingungen :-)

                                                                            Ich werde jetzt mal die Lösung unter "Kurzfassung" ausprobieren, auch wenn ich sie noch nicht verstehe. Ich hatte auch im Quelletext von sr-online gesehen, dass die HTML - Seite als XML definiert wird und mich gewundert. Nach meiner Einschätzung hat der sr anscheinend nicht nur kein Geld für einen ordentlichen rss-feed, sondern auch keines für eine ordentlich homepage.

                                                                            Da wäre ich jetzt nicht so streng.
                                                                            Eine absolute Wahrheit gibt es wohl nicht in der Webentwicklung, weil die Vorgaben von den diversen Browsern immer noch nicht eingehalten werden und die Anbieter daher oft "gewachsene Lösungen" haben, die zumindest einigermaßen funktionieren.

                                                                            Wie gesagt, Danke, mal gucken ob ich die "Kurzfassung" einbauen kann, so wie ich es brauche.

                                                                            Das ist noch nicht das Non-Plus-Ultra gewesen. Dedlfix hat die Angabe dür die Kodierung noch besser gelöst:

                                                                            $page = file_get_contents($url);
                                                                            $meta = '<' . '?xml encoding="utf-8" ?' . ">\r\n";  ## *1)
                                                                            $dom = new DOMDocument('1.0', 'utf-8');
                                                                            $dom->loadHTML($meta . $page);
                                                                            

                                                                            Dieses merkwürdige Zusammenstoppeln für den xml-Tag habe ich gemacht, weil der PHP-Parser sonst kotzen könnte, wenn Short-Open-Tags eingeschaltet sind. Leider auch, wenn sie ausgeschaltet sind und man eine Zeile mit "?>" auskommeniert...

                                                                            Ich mach Dir einen anderen Vorschlag: Da ich an einer ähnlichen Sache sitze und mich sowieso durchkämpfen muss, beschreibe doch einfach möglichst genau, was Du benötigst. Ich versuche dann mal, das möglichst sauber umzusetzen und hoffe, dass mir Dedlfix dabei auf die Finger guckt. Ich schreibe dann auch veiel Kommenrtare dazu und würde mich freuen, wenn jemands diesen doch mMn typischen Anwendungsfall für's WIKI aufbereiten würde.

                                                                            Ich ahbe hier in den letzten Tagen schon drei bis vier wesentliche Kniffe für die DOMDocument-Classes dazugelernt und würde die gerne dokumentieren, bevor sie wiedre in Vergessenheit geraten.

                                                                            Habe mich gerade auch hier angemeldet, aber das funktioniert noch nicht so ganz. Da ist wohl wieder der Browser dran Schuld, der immer erstmal alle Cookies ablehnt.

                                                                            Grüße
                                                                            TS

                                                                            1. @TS-ohne

                                                                              das ist aber ein sehr nettes Angebot. Wie gesagt, ich habe ja auf meiner Seite ansonsten rss-feeds geparst ohne große Probleme. Nur NDR und sr-online lese ich mit Xpath aus, habe mir das zusammengeschustert in Absprache mit sr-online. Das sieht dann wenig elegant so aus, dass ich alle Seiten durchlese (ich führe jetzt hier mal nicht alle einzelnen Seiten auf), die descriptions für meine tooltipps erstmal hole und in ein array packe und am Ende die titles und links verknüpfe und die description in einen tooltipp packe (siehe meine SeiteLinkbeschreibung. Hier der Code:

                                                                              <?php $data = file_get_contents('http://www.sr-online.de/sronline/nachrichten/hoerfunknachrichten/hoerfunknachrichten_aktuell100.html');
                                                                              
                                                                              $doc = new DOMDocument();
                                                                              
                                                                              $doc->loadHTML($data);
                                                                              
                                                                              $zaehler = 0;
                                                                              
                                                                              $xPath = new DOMXPath($doc);
                                                                              
                                                                              foreach ($xPath->query('//div/p') as $node2) {
                                                                              
                                                                              if (($zaehler <= 10)&& ($node2->nodeValue !== '') && ($node2->nodeValue !== NULL)){
                                                                              $array[$zaehler] = utf8_decode($node2->nodeValue);
                                                                              $zaehler++;
                                                                              
                                                                              }
                                                                              }
                                                                              $data = file_get_contents('http://www.sr-online.de/sronline/nachrichten/hoerfunknachrichten/hoerfunknachrichten_aktuell100~_seite-2.html');
                                                                              $doc = new DOMDocument('1.0', 'utf-8');
                                                                              
                                                                              $doc->loadHTML($data);
                                                                              
                                                                              
                                                                              $xPath = new DOMXPath($doc);
                                                                              foreach ($xPath->query('//div/p') as $node2) {
                                                                              
                                                                              if (($zaehler <= 10)&& ($node2->nodeValue !== '') && ($node2->nodeValue !== NULL)){
                                                                              
                                                                              $array[$zaehler] = utf8_decode($node2->nodeValue);
                                                                              
                                                                              $zaehler++;
                                                                              
                                                                              }
                                                                              }
                                                                              

                                                                              ......usw auch die anderen (insgesamt 7) Seiten und dann:

                                                                              $data = file_get_contents('http://www.sr-online.de/sronline/nachrichten/hoerfunknachrichten/hoerfunknachrichten_aktuell100.html');
                                                                              
                                                                              $doc = new DOMDocument('1.0', 'utf-8');
                                                                              $doc->loadHTML($data);
                                                                              
                                                                              $xPath = new DOMXPath($doc);
                                                                              
                                                                              $zaehler = 0;
                                                                              foreach ($xPath->query("//div[@class=\"mitte_folgeseiten\"]/ul/li/a") as $element) { 
                                                                                  if ($zaehler <= 7)
                                                                                  {
                                                                                      $hreft = $element->getAttribute("href");
                                                                                      $title = $element->nodeValue;
                                                                                      $href  = "http://www.sr-online.de".$hreft;
                                                                              
                                                                              $href = utf8_decode($href);
                                                                              $title = utf8_decode($title);
                                                                                  ?>                     
                                                                                                  <li><a href='
                                                                                                  <?php echo htmlspecialchars ($href); ?>
                                                                                                  ' target='_blank'  class="ketchup tooltip" title="
                                                                                                   <?php 
                                                                                                   echo htmlspecialchars ($array[$zaehler], ENT_QUOTES);  ?>  
                                                                                                  ">
                                                                                                  <?php echo htmlspecialchars ($title); ?> 
                                                                                                  </a></li>
                                                                                  <?php
                                                                                  $zaehler++;
                                                                                  }
                                                                              }
                                                                              ?>
                                                                              
                                                                              

                                                                              Nochmals dank für Deine Mühe. Gruß glupto

                                                                              1. @TS ist OK, jetzt funktionierts ;-))

                                                                                Rehallo,

                                                                                das ist aber ein sehr nettes Angebot.

                                                                                Deinen Quellcode wollte ich allerdings nicht gerne reverse engineeren ;-O

                                                                                Ich fasse mal zusammen, was ich verstanden habe:

                                                                                Alternativ-Text

                                                                                Du möchtest den markierten Bereich auswerten?
                                                                                Davon benötigst Du die Original-Links und dann eine Funktion, die jeweils den Teaser nebst Überschriften für jeden Link beschafft?

                                                                                Wie machst Du das bisher?

                                                                                Bitte korrigiere mich. Und bitte lieber mit Bild und Klartext-Beschreibung, als mit Code-Idee. Code besprechen wir dann erst anschließend. Und wenn Du schon mal fragen könntest bei SR, ob die mit einer Nennung nebst Screenshot in einem Beispiel im SelfHTML-Wiki und für Unterrichtszwecke einverstanden sind, wäre das gleich doppelt interessant.

                                                                                Was brauchst Du noch? Bitte auch lieber mit Bild und Trivalbeschreibung, als mit Code-Ideen.

                                                                                Grüße
                                                                                TS

                                                                                1. Eigentlich hast Du schon alles genannt, ich brauche den Inhalt von title, description und href, also Schlagzeile, Teasertext (entspricht hier dem kompletten Meldungstext) und Link. Das ist alles leider nicht auf einer Seite untergebracht, sondern auf Unterseiten, die deshalb einzeln geparst werden müssen. Am Ende soll alles so aussehen wie auf meiner jetzigen Seite, bloß ohne Fehler:

                                                                                  Alternativ-Text

                                                                                  Der Teaser-Text landet in einem tooltipp, der bei mouseover erscheint. Aber eigentlich brauche ich nur den Inhalt der Felder in verlässlicher Zeichendarstellung. Jetzt gehe ich auf jede Seite und parse mithilfe von Xpath den Meldungstext, indem ich nach ($xPath->query('//div/p') as $node2) { suche, dann packe ich den Text in ein array, dann gehe ich auf die erste Seite und hole mir dort ebenfalls mit xpath

                                                                                   ($xPath->query("//div[@class=\"mitte_folgeseiten\"]/ul/li/a") as $element) 
                                                                                  

                                                                                  die Schlagzeilen und mit

                                                                                          $hreft = $element->getAttribute("href");
                                                                                          $title = $element->nodeValue;
                                                                                  

                                                                                  Links und Titel. Dann gebe ich es als Liste aus - wie auf dem Bild zu sehen. So, ein wenig Code musste sein, sonst hätte ich es nicht anders erklären können.

                                                                                  Schönen Gruß glupto p.S.das Zeichenproblem ist in der vorletzten Schlagzeile ja mal wieder prima zu sehen.

                                                                                  1. Hallo,

                                                                                    Eigentlich hast Du schon alles genannt, ich brauche:

                                                                                    • den Inhalt von title,
                                                                                    • description
                                                                                    • href,

                                                                                    also Schlagzeile, Teasertext (entspricht hier dem kompletten Meldungstext) und Link. Das ist alles leider nicht auf einer Seite untergebracht, sondern auf Unterseiten, die deshalb einzeln geparst werden müssen. Am Ende soll alles so aussehen wie auf meiner jetzigen Seite, bloß ohne Fehler:

                                                                                    Alternativ-Text

                                                                                    Der Teaser-Text landet in einem tooltipp, der bei mouseover erscheint. Aber eigentlich brauche ich nur den Inhalt der Felder in verlässlicher Zeichendarstellung. Jetzt gehe ich auf jede Seite und parse mithilfe von Xpath den Meldungstext, [...]

                                                                                    Das habe ich mir soweit angeschaut und daraus meine Schlüsse gezogen.

                                                                                    SR-Online ist so freundlich, alle notwenigen Elemente (bitt kontrollieren) im Container

                                                                                    <div id="mitte_text">
                                                                                    

                                                                                    zusammenzufassen. Den habe ich mir einfach rausgeholt aus der Seite und z.B. mal eben die Links darin umgeschrieben auf absolute (http://sr-online.de/ [...]) Adressierung. Das geht mit DOMDocument alles recht einfach, wenn man erst einmal die Hürden überwunden hat.

                                                                                    Alternativ-Text

                                                                                    Die nächste Überlegung sollte also sein, ob in dem gegrabbten Container (s.o.) alles enthalten ist, was du benötigst -> Quellcode:

                                                                                    <!DOCTYPE HTML>
                                                                                    <html lang="de">
                                                                                    
                                                                                    <head>
                                                                                    	<title>SR-Online</title>
                                                                                    </head>
                                                                                    <body>
                                                                                    	
                                                                                    <div id="mitte_text">
                                                                                    <h1>Hörfunknachrichten, 13.06.2015 12:10 Uhr</h1>
                                                                                    <div><h1>
                                                                                    <!--13.06.2015 1200-->Berlin: Gutachter widersprechen Regierungsabsicht</h1></div>
                                                                                    <div><p>Für den NSA-Untersuchungsausschuss steigen die Chancen, doch noch Einsicht in die sogenannte Selektorenliste des US-Geheimdienstes zu erhalten.
                                                                                    Nach Einschätzung des Wissenschaftlichen Dienstes des Bundestages ist es nicht zulässig, die Akten einem Sonderermittler vorzulegen und gleichzeitig dem Ausschuss die Einsicht zu verweigern. Ein Ermittlungsbeauftragter sei nur Hilfsperson und dürfe nicht mehr Rechte haben als der Ausschuss.
                                                                                    Die Selektorenliste könnte Aufschluss darüber geben, wen die NSA mit Hilfe des BND ausgeforscht hat.
                                                                                    </p></div>
                                                                                    <div></div>
                                                                                    <hr style="height:2px;">
                                                                                    <div class="mitte_folgeseiten"><ul>
                                                                                    <li>
                                                                                    <img src="http://sr-online.de/sronline/images/element_mitte_link_intern.gif" height="9" width="22" alt="Link"><a href="http://sr-online.de/sronline/nachrichten/hoerfunknachrichten/hoerfunknachrichten_aktuell100~_seite-1.html"><!--13.06.2015 1200-->Brüssel: Griechenland geht optimistisch in weitere Verhandlungen</a>
                                                                                    </li>
                                                                                    <li>
                                                                                    <img src="http://sr-online.de/sronline/images/element_mitte_archiv_thispage.gif" height="9" width="22" alt="Link"><a href="http://sr-online.de/sronline/nachrichten/hoerfunknachrichten/hoerfunknachrichten_aktuell100~_seite-2.html"><!--13.06.2015 1200-->Berlin: Gutachter widersprechen Regierungsabsicht</a>
                                                                                    </li>
                                                                                    <li>
                                                                                    <img src="http://sr-online.de/sronline/images/element_mitte_link_intern.gif" height="9" width="22" alt="Link"><a href="http://sr-online.de/sronline/nachrichten/hoerfunknachrichten/hoerfunknachrichten_aktuell100~_seite-3.html"><!--13.06.2015 1201-->Essen: Gläubiger dürfen sich bei Middelhoff bedienen</a>
                                                                                    </li>
                                                                                    <li>
                                                                                    <img src="http://sr-online.de/sronline/images/element_mitte_link_intern.gif" height="9" width="22" alt="Link"><a href="http://sr-online.de/sronline/nachrichten/hoerfunknachrichten/hoerfunknachrichten_aktuell100~_seite-4.html"><!--13.06.2015 1202-->Washington: Schwere Abstimmungsniederlage für Obama</a>
                                                                                    </li>
                                                                                    <li>
                                                                                    <img src="http://sr-online.de/sronline/images/element_mitte_link_intern.gif" height="9" width="22" alt="Link"><a href="http://sr-online.de/sronline/nachrichten/hoerfunknachrichten/hoerfunknachrichten_aktuell100~_seite-5.html"><!--13.06.2015 1202-->Saarbrücken: Neue ICE-Generation nach Paris</a>
                                                                                    </li>
                                                                                    <li>
                                                                                    <img src="http://sr-online.de/sronline/images/element_mitte_link_intern.gif" height="9" width="22" alt="Link"><a href="http://sr-online.de/sronline/nachrichten/hoerfunknachrichten/hoerfunknachrichten_aktuell100~_seite-6.html"><!--13.06.2015 1203-->Luxemburg : Festakt zu 30 Jahre Schengener Abkommen  </a>
                                                                                    </li>
                                                                                    <li>
                                                                                    <img src="http://sr-online.de/sronline/images/element_mitte_link_intern.gif" height="9" width="22" alt="Link"><a href="http://sr-online.de/sronline/nachrichten/hoerfunknachrichten/hoerfunknachrichten_aktuell100~_seite-7.html"><!--13.06.2015 1203-->Luxemburg : Kulturzentrum „rotondes" wird eröffnet </a>
                                                                                    </li>
                                                                                    <li>
                                                                                    <img src="http://sr-online.de/sronline/images/element_mitte_link_intern.gif" height="9" width="22" alt="Link"><a href="http://sr-online.de/sronline/nachrichten/hoerfunknachrichten/hoerfunknachrichten_aktuell100~_seite-8.html"><!--13.06.2015 1204-->: Das Wetter: Wechselhaft bis 26 Grad</a>
                                                                                    </li>
                                                                                    </ul></div>
                                                                                    <!-- Falls Personendokument, dann als Moderator(en) ausgeben -->
                                                                                    <div class="autor">(Saarländischer Rundfunk)</div>
                                                                                    <p style="clear:both;"></p>
                                                                                    </div>
                                                                                    	
                                                                                    </body>
                                                                                    </html>
                                                                                    

                                                                                    Die Dokumentstruktur drum herum stammt von mir. Geholt habe ich nur das DIV und habe die Links (href=) und die Images (src=) automatisch umgeschrieben, da die bei SR-Online nur absolut zur DOMAIN angebeben werden (mMn auch sinnvoll).

                                                                                    Du kannst also nun entscheiden, wie Du vorgehen willst:

                                                                                    • Du erhältst ein Array mit Klartextangaben, die Du dann fürs neue HTML verarbeiten musst
                                                                                    • Du erhältst fertige HTML-Nodes, die Du mittels DOMDocument in dein neues Dokument einfügen kannst.

                                                                                    Mangels Erfahrungen damit würde ich das nicht als Klasse bauen. Ich würde mich aber freuen, wenn das jemand umbauen könnte nachher, wenn alles funktioniert. Ich will schließlich auch noch 'was lernen :-)

                                                                                    Grüße
                                                                                    TS

                                                                                    PS:
                                                                                    nebenbei kümmere ich mich um meine abgestürzte Terabyte-Platte. Immer, wenn die arbeitet, gucke ich hier... Drück mir die Daumen, dass ich die Daten alle retten kann :-)

                                                                                    1. Und wie hast Du das gemacht? Auch mit Xpath? Den Inhalt des Mitte-Containers hatte ich mir auch geholt, also title und href und dann sr-online.de davorgepackt. Aber wie kriegst Du denn nun das Ganze ohne utf8-Probleme da heraus....? Also, wenn alles in einem array ist, ist ja gut...

                                                                                      Ich drücke natürlich die Daumen für die Festplatte.

                                                                                      1. Und wie hast Du das gemacht? Auch mit Xpath? Den Inhalt des Mitte-Containers hatte ich mir auch geholt, also title und href und dann sr-online.de davorgepackt. Aber wie kriegst Du denn nun das Ganze ohne utf8-Probleme da heraus....? Also, wenn alles in einem array ist, ist ja gut...

                                                                                        Erst einmal zum Verfahren: Der Zugriff erfolgt immer über die Nodes. Wenn man so einen elegantgen Aufsetzpunkt hat, wie hier bei SR-Online, dann kann man von aus aufwärts und abwärts im Baum navigieren.

                                                                                        nur kurz der erste Ansatz für den Ausschnitt, den ich schon gepostet hatte.

                                                                                        <?php 
                                                                                        
                                                                                        header('Content-Type: text/html; CharSet="utf-8">');
                                                                                        $_errors = array();
                                                                                        
                                                                                        #------------------------------------------------------------------------------
                                                                                        function handleError($errno, $errstr, $errfile, $errline, array $errcontext) 
                                                                                        {
                                                                                        	global $_errors;
                                                                                        
                                                                                        	$_errors[] = array('errno' => $errno, 'errstr' => $errstr, 
                                                                                        		'errfile' => $errfile, 'errline' => $errline); # , 'context' => $errcontext); 
                                                                                        }
                                                                                        #------------------------------------------------------------------------------
                                                                                        
                                                                                        $url = 'http://www.sr-online.de/sronline/nachrichten/hoerfunknachrichten/hoerfunknachrichten_aktuell100~_seite-2.html';
                                                                                        
                                                                                        $page = file_get_contents($url);
                                                                                        $meta = '<?xml encoding="UTF-8" ?'.'>' . "\r\n";  ## Das reicht der DOMDocument-Class jetzt aber!
                                                                                        
                                                                                        	$dom = new DOMDocument('1.0', 'utf-8');
                                                                                        	$dom->encoding = 'utf-8';
                                                                                        	$dom->validateOnParse = true;
                                                                                        	$dom->strictErrorChecking = true ;
                                                                                        #	$dom->strictErrorChecking = false ;
                                                                                        #    $dom->substituteEntities = true;   ## Darf man nicht machen, wenn das Doc nacher wieder 
                                                                                        										## komplett im HTML-Kontext ausgegeben werden soll
                                                                                        	$dom->preserveWhiteSpace = true;
                                                                                        #	$dom->resolveExternals = true;
                                                                                        
                                                                                        	set_error_handler('handleError', E_WARNING);
                                                                                        	$dom->loadHTML($meta . $page);
                                                                                        	restore_error_handler();
                                                                                        
                                                                                        	## 	hier wird der Hauptcontainer referenziert
                                                                                        	$node = $dom->getElementById('mitte_text');
                                                                                        
                                                                                        	## hier werden die Links _im_ Container in einer dynamischen Liste referenziert
                                                                                        	$linklist = $node->getElementsByTagName('a');
                                                                                        
                                                                                        	## Liste der Links durcharbeiten
                                                                                        	if ($linklist->length > 0)
                                                                                        	{	
                                                                                        		foreach ($linklist as $link)
                                                                                        		{
                                                                                        			## falls Attribute vorhanden sind
                                                                                        			if ($link->hasAttributes())
                                                                                        			{	
                                                                                        				foreach($link->attributes as $attribute)
                                                                                        				{
                                                                                        					if ($attribute->name == 'href') { $attribute->value = 'http://sr-online.de' . $attribute->value; }
                                                                                        				}
                                                                                        			}	
                                                                                        		}
                                                                                            }
                                                                                        		
                                                                                        	## Images im Container in einer dynamischen Liste referenzieren
                                                                                        	$imglist = $node->getElementsByTagName('img');
                                                                                        
                                                                                        	if ($imglist->length > 0)
                                                                                        	{	
                                                                                        		foreach ($imglist as $img)
                                                                                        		{
                                                                                        			if ($img->hasAttributes())
                                                                                        			{	
                                                                                        				foreach($img->attributes as $attribute)
                                                                                        				{
                                                                                        					if ($attribute->name == 'src') { $attribute->value = 'http://sr-online.de' . $attribute->value; }
                                                                                        				}
                                                                                        			}
                                                                                        		}
                                                                                        	}	
                                                                                        
                                                                                            $text = $dom->saveHTML($node);
                                                                                        
                                                                                        ?>
                                                                                        <!DOCTYPE HTML>
                                                                                        <html lang="de">
                                                                                        
                                                                                        <head>
                                                                                        	<title>SR-Online</title>
                                                                                        </head>
                                                                                        <body>
                                                                                        	
                                                                                        <?php echo $text; ?>
                                                                                        	
                                                                                        </body>
                                                                                        </html>
                                                                                        

                                                                                        Grüße
                                                                                        TS

                                                                                        1. Danke, dann werde ich mal versuchen, das in mein Schema zu bekommen. Denn ich möchte ja nicht sr-online als html nachbauen, sondern brauche nachher z.B. keine images usw. sondern nur die drei arrays mit title, link und description, die ich entsprechend mit meinem css usw. als Bestandteil meiner Seite ausgeben will (desc als tooltipp usw).

                                                                                          1. @@glupto

                                                                                            nur die drei arrays mit title, link und description, die ich entsprechend mit meinem css usw. als Bestandteil meiner Seite ausgeben will (desc als tooltipp usw).

                                                                                            Dir ist bewusst, dass viele Nutzer (die meisten? auf jeden Fall Tendenz steigend) niemals in den „Genuss“ eines Tooltips kommen werden, weil sie gar keine Maus haben, um die Seite nach mystery meat zu durchsuchen?

                                                                                            LLAP 🖖

                                                                                            --
                                                                                            „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
                                                                                            1. @@glupto

                                                                                              nur die drei arrays mit title, link und description, die ich entsprechend mit meinem css usw. als Bestandteil meiner Seite ausgeben will (desc als tooltipp usw).

                                                                                              Dir ist bewusst, dass viele Nutzer (die meisten? auf jeden Fall Tendenz steigend) niemals in den „Genuss“ eines Tooltips kommen werden, weil sie gar keine Maus haben, um die Seite nach mystery meat zu durchsuchen?

                                                                                              ja, dafür habe ich eine Mobilversion, bei der beim ersten touch auf eine Schlagzeile der Teasertext kommt, in dem dann der link ("....mehr") steckt. Wer überhaupt keinen Teasertext sehen will, für den wird eine Variante ohne tooltipp angeboten. Ich möchte das alles noch personalisieren (welche Medien, wieviele Schlagzeilen, mit/ohne tooltipps), aber dazu muss ich mich erstmal mit cookies auskennen (vor einer DB-Lösung mit Userlogin schrecke ich noch mehr zurück).

                                                                                              1. Hi glupto,

                                                                                                ich war Dir noch meine Version schuldig geblieben. Gestern habe ich es nicht mehr geschafft, musste draußen noch 'was erledigen. Die Sonne schien...

                                                                                                Hier jedenfalls erst einmal ein funtkionierendes Gestrüpp:

                                                                                                <?php 
                                                                                                
                                                                                                header('Content-Type: text/html; CharSet="utf-8">');
                                                                                                $_errors = array();
                                                                                                
                                                                                                #==============================================================================
                                                                                                function handleError($errno, $errstr, $errfile, $errline, array $errcontext) 
                                                                                                {
                                                                                                	global $_errors;
                                                                                                
                                                                                                	$_errors[] = array('errno' => $errno, 'errstr' => $errstr, 
                                                                                                		'errfile' => $errfile, 'errline' => $errline); # , 'context' => $errcontext); 
                                                                                                }
                                                                                                
                                                                                                #==============================================================================
                                                                                                function get_links($node = NULL)
                                                                                                {
                                                                                                	if ($node === NULL) return false;
                                                                                                	$_links = array();
                                                                                                	
                                                                                                	$__linklist = $node->getElementsByTagName('a');
                                                                                                
                                                                                                	## Liste der Links durcharbeiten
                                                                                                	if ($__linklist->length > 0)
                                                                                                	{	
                                                                                                		foreach ($__linklist as $key => $__link)
                                                                                                		{
                                                                                                			## falls Attribute vorhanden sind
                                                                                                			if ($__link->hasAttribute('href'))
                                                                                                			{	
                                                                                                				$_links[$key]['href'] = $__link->getAttribute('href'); 
                                                                                                				$_links[$key]['linktext'] = $__link->textContent;
                                                                                                			}	
                                                                                                		}
                                                                                                    }
                                                                                                	return $_links;
                                                                                                } 
                                                                                                
                                                                                                #==============================================================================
                                                                                                ## php main
                                                                                                #==============================================================================
                                                                                                
                                                                                                $scheme = 'http://';
                                                                                                $domain = 'www.sr-online.de';
                                                                                                $url = $scheme . $domain . '/sronline/nachrichten/hoerfunknachrichten/hoerfunknachrichten_aktuell100.html';
                                                                                                
                                                                                                $page = file_get_contents($url);
                                                                                                $meta = '<?xml encoding="UTF-8" ?'.'>' . "\r\n";  ## Das reicht der DOMDocument-Class jetzt aber!
                                                                                                
                                                                                                	$dom = new DOMDocument('1.0', 'utf-8');
                                                                                                	$dom->encoding = 'utf-8';
                                                                                                	$dom->validateOnParse = true;
                                                                                                	$dom->strictErrorChecking = true ;
                                                                                                
                                                                                                	$dom->preserveWhiteSpace = true;
                                                                                                
                                                                                                	set_error_handler('handleError', E_WARNING);
                                                                                                	$dom->loadHTML($meta . $page);
                                                                                                	restore_error_handler();
                                                                                                
                                                                                                	## 	hier wird der Hauptcontainer referenziert
                                                                                                	$node = $dom->getElementById('mitte_text');
                                                                                                
                                                                                                	$_links = get_links($node);
                                                                                                
                                                                                                	foreach ($_links as $key => $link)
                                                                                                	{
                                                                                                		$container = file_get_contents($scheme.$domain.$link['href']);
                                                                                                		set_error_handler('handleError', E_WARNING);		
                                                                                                		$dom->loadHTML($meta . $container);
                                                                                                		restore_error_handler();		
                                                                                                		$node = $dom->getElementById('mitte_text');
                                                                                                                
                                                                                                                ## XPath für die Node feststellen
                                                                                                		$nodexpath = $node->getNodePath();
                                                                                                		
                                                                                                		$xpath = new DOMXpath($dom);
                                                                                                
                                                                                                		$elements = $xpath->query($nodexpath .'/h1');	
                                                                                                		if ($elements->length > 0 ) $_links[$key]['heading_1'] = $elements->item(0)->textContent;		
                                                                                                
                                                                                                		## SR benutzt leid3r manchmal H1 und manchmal H2 an dieser Stelle
                                                                                                		$elements = $xpath->query($nodexpath .'/div[1]/h1');	
                                                                                                		if ($elements->length > 0 ) $_links[$key]['heading_2'] = $elements->item(0)->textContent;		
                                                                                                
                                                                                                		$elements = $xpath->query($nodexpath .'/div[1]/h2');	
                                                                                                   		if ($elements->length > 0 ) $_links[$key]['heading_2'] = $elements->item(0)->textContent;		
                                                                                                		
                                                                                                		$elements = $xpath->query($nodexpath .'/div[2]/p');	
                                                                                                		if ($elements->length > 0 ) $_links[$key]['teaser'] = $elements->item(0)->textContent;
                                                                                                	}
                                                                                                
                                                                                                ###################################################################################################	
                                                                                                ## HTML Out
                                                                                                ###################################################################################################		
                                                                                                ?>
                                                                                                <?php echo $meta; ?>
                                                                                                <!DOCTYPE HTML>
                                                                                                <html lang="de">
                                                                                                
                                                                                                <head>
                                                                                                	<title>SR-Online</title>
                                                                                                </head>
                                                                                                <body>
                                                                                                
                                                                                                <pre>	
                                                                                                <?php 
                                                                                                	echo htmlspecialchars(print_r($_links, 1)); 
                                                                                                ?>
                                                                                                </pre>	
                                                                                                </body>
                                                                                                </html>
                                                                                                

                                                                                                Grüße
                                                                                                TS

                                                                                                1. Danke nochmals für Deine Mühe. Ich habe mir das jetzt davon genommen und eingebaut, was ich brauchen konnte - und bisher keine missratenen Zeichen entdecken können!

                                                                                                  Also, Dank und Gruß glupto

                                                                                                  1. Hallo Leute,

                                                                                                    Danke nochmals für Deine Mühe. Ich habe mir das jetzt davon genommen und eingebaut, was ich brauchen konnte - und bisher keine missratenen Zeichen entdecken können!

                                                                                                    Ich mach da auch immer noch Gehübungen mit der DOMDocument-Klassensammlung. Alles ist mir noch nicht klar. Vorhin ist mir durch die Unstabilitäten der SR-Online-Seite noch eine Merkwürdigkeit mit der Auswertung der XPath-Queries untergekommen. Leider nutzen die nicht immer dieselben Überschriften. Mal H1 und mal H2. Und der Bereich "<div></div>" hinter der eigentlichen Teaser-Meldung ist auch nicht immer vorhanden. Und da blieb dann der Teaser leer, obwohl das Query dafür vorhanden war und augenscheinlich zum vorhandenen XPath passte. Hier deshalb nochmal eine Guck- und Nachdenklösung, die einfach per Copy & Paste eine sinnvolle Ausgabe ergeben sollte.

                                                                                                    Ich suche noch nach einer anderen Möglichkeit, aus einem eindeutigen XPath wieder eine $node zu machen. Aber das geht vermutlich nur über die Elementliste, die man per query() erhält.

                                                                                                    
                                                                                                    <?php  ### utf-8 ###
                                                                                                    ## $dom->loadHTML verursacht immer Warnungen beim Parsen, wenn das Dokument 
                                                                                                    ## Fehler enthält. Das habe ich leider nicht abgeschaltet bekommen.  
                                                                                                    ## Damit die Warnungen nicht stumpf abgeschaltet werden müssen, sondern
                                                                                                    ## für die Nutzung zur Verfügung stehen, werden sie in $_errors gesammelt
                                                                                                    
                                                                                                    
                                                                                                    header('Content-Type: text/html; CharSet="utf-8">');
                                                                                                    $_errors = array();
                                                                                                    
                                                                                                    
                                                                                                    #==============================================================================
                                                                                                    function handleError($errno, $errstr, $errfile, $errline, array $errcontext) 
                                                                                                    {
                                                                                                    	global $_errors;
                                                                                                    
                                                                                                    	$_errors[] = array('errno' => $errno, 'errstr' => $errstr, 
                                                                                                    		'errfile' => $errfile, 'errline' => $errline); # , 'context' => $errcontext); 
                                                                                                    }
                                                                                                    
                                                                                                    #==============================================================================
                                                                                                    function get_links($node = NULL)
                                                                                                    {
                                                                                                    	if ($node === NULL) return false;
                                                                                                    	$_links = array();
                                                                                                    	
                                                                                                    	$__linklist = $node->getElementsByTagName('a');
                                                                                                    
                                                                                                    	## Liste der Links durcharbeiten
                                                                                                    	if ($__linklist->length > 0)
                                                                                                    	{	
                                                                                                    		foreach ($__linklist as $key => $__link)
                                                                                                    		{
                                                                                                    			## falls Attribute vorhanden sind
                                                                                                    			if ($__link->hasAttribute('href'))
                                                                                                    			{	
                                                                                                    				$_links[$key]['href'] = $__link->getAttribute('href'); 
                                                                                                    				$_links[$key]['linktext'] = $__link->textContent;
                                                                                                    			}	
                                                                                                    		}
                                                                                                        }
                                                                                                    	return $_links;
                                                                                                    } 
                                                                                                    #==============================================================================
                                                                                                    function get_nodepathes($node, $link = '')
                                                                                                    {
                                                                                                        $output = "[$link]: \r\n";
                                                                                                        $_elements = $node->getElementsByTagName('*');
                                                                                                        
                                                                                                        foreach ($_elements as $key => $element)
                                                                                                        {
                                                                                                            $output .= $element->getNodePath() . "\r\n";
                                                                                                        }
                                                                                                    
                                                                                                        return $output . "\r\n";
                                                                                                    }
                                                                                                    
                                                                                                    #==============================================================================
                                                                                                    ## php main
                                                                                                    #==============================================================================
                                                                                                    
                                                                                                    $scheme = 'http://';
                                                                                                    $domain = 'www.sr-online.de';
                                                                                                    $url = $scheme . $domain . '/sronline/nachrichten/hoerfunknachrichten/hoerfunknachrichten_aktuell100.html';
                                                                                                    
                                                                                                    $page = file_get_contents($url);
                                                                                                    $meta = '<?xml encoding="UTF-8" ?'.'>' . "\r\n";  ## Das reicht der DOMDocument-Class jetzt aber!
                                                                                                    
                                                                                                    	$dom = new DOMDocument('1.0', 'utf-8');
                                                                                                    	$dom->encoding = 'utf-8';
                                                                                                    	$dom->validateOnParse = true;
                                                                                                    	$dom->strictErrorChecking = true ;
                                                                                                    #       $dom->substituteEntities = true;
                                                                                                    
                                                                                                    	$dom->preserveWhiteSpace = true;
                                                                                                    
                                                                                                    	set_error_handler('handleError', E_WARNING);
                                                                                                    	$dom->loadHTML($meta . $page);
                                                                                                    	restore_error_handler();
                                                                                                    
                                                                                                    	## 	hier wird der Hauptcontainer referenziert
                                                                                                    	$node = $dom->getElementById('mitte_text');
                                                                                                    
                                                                                                    	$_links = get_links($node);
                                                                                                    
                                                                                                        $output = '';
                                                                                                        
                                                                                                    	foreach ($_links as $key => $link)
                                                                                                    	{
                                                                                                    		$container = file_get_contents($scheme.$domain.$link['href']);
                                                                                                    		set_error_handler('handleError', E_WARNING);		
                                                                                                    		$dom->loadHTML($meta . $container);
                                                                                                    		restore_error_handler();		
                                                                                                    		$node = $dom->getElementById('mitte_text');
                                                                                                    		$nodexpath = $node->getNodePath();
                                                                                                    
                                                                                                            $output .= get_nodepathes($node, $link['href']);
                                                                                                    		
                                                                                                    		$xpath = new DOMXpath($dom);
                                                                                                    
                                                                                                    		$elements = $xpath->query($nodexpath .'/h1');	
                                                                                                    		if ($elements->length > 0 ) $_links[$key]['heading_1'] = $elements->item(0)->textContent;		
                                                                                                    
                                                                                                    		## SR benutzt leider manchmal H1 und manchmal H2 an dieser Stelle
                                                                                                    #		$elements = $xpath->query($nodexpath .'/div[1]/h1');	
                                                                                                            ## Der textContent von div[1]/h1 ist auch schon in div[1] enthalten
                                                                                                    		$elements = $xpath->query($nodexpath .'/div[1]');	
                                                                                                    		if ($elements->length > 0 ) $_links[$key]['heading_2'] = $elements->item(0)->textContent;		
                                                                                                    
                                                                                                    #		$elements = $xpath->query($nodexpath .'/div[1]/h2');	
                                                                                                    #   		if ($elements->length > 0 ) $_links[$key]['heading_2'] = $elements->item(0)->textContent;		
                                                                                                    
                                                                                                    #		$elements = $xpath->query($nodexpath .'/div[1]/p');	
                                                                                                    #		if ($elements->length > 0 ) $_links[$key]['teaser'] = $elements->item(0)->textContent;
                                                                                                    		
                                                                                                    #		$elements = $xpath->query($nodexpath .'/div[2]/p');	
                                                                                                            ## Der textContent von div[2]/p ist auch schon in div[2] enthalten
                                                                                                    		$elements = $xpath->query($nodexpath .'/div[2]');	## Der textContent von div[2]/p ist auch in div[2] enthalten
                                                                                                    		if ($elements->length > 0 ) $_links[$key]['teaser'] = $elements->item(0)->textContent;
                                                                                                    	}
                                                                                                    
                                                                                                    	
                                                                                                    	file_put_contents('sr-online.' . date('Ymd_His') . '.txt', htmlspecialchars(print_r($_links, 1)));
                                                                                                    
                                                                                                    	
                                                                                                    ###################################################################################################	
                                                                                                    ## HTML Out
                                                                                                    ###################################################################################################		
                                                                                                    ?>
                                                                                                    <?php echo $meta; ?>
                                                                                                    <!DOCTYPE HTML>
                                                                                                    <html lang="de">
                                                                                                    
                                                                                                    <head>
                                                                                                    	<title>SR-Online</title>
                                                                                                    </head>
                                                                                                    <body>
                                                                                                    
                                                                                                    <pre>	
                                                                                                    <?php 
                                                                                                        echo htmlspecialchars($output);
                                                                                                    	echo htmlspecialchars(print_r($_links, 1)); 
                                                                                                    ?>
                                                                                                    </pre>	
                                                                                                    </body>
                                                                                                    </html>
                                                                                                    
                                                                                                    

                                                                                                    Ich habe die Auskommentierten Versuche drin gelassen, damit man sehen kann, wie ich es außerdem noch versucht habe.

                                                                                                    Da in $node->textContent auch derjenige Textcontent der untergeordenten Nodes enthalten ist, wenn es solche gibt, benutze ich hier immer die übergeordneten.

                                                                                                    Man könnte wegen der Rückwandlung von Entities nun noch versuchen, die Einstellung

                                                                                                       $dom->substituteEntities = true;
                                                                                                    

                                                                                                    ausprobieren. Mir sind aber bisher noch keine Entities wieder untergekommen. Ich müsste dafür also extra nochmal ein Testdokument bauen.

                                                                                                    Bei der Ausgabe müsste man dann allerdings wieder dran denken, htmlspecialchars() zu verwenden, was man ja eigentlich sowieso lieber selber machen sollte und sich nicht darauf verlassen sollte, dass SR-Online schon fertig vorgekautes Material liefert. Wenn Du dir die $_errors ausgeben lässt, wirst Du nömlich feststellen, dass sie in den Links das Ampen (&amp;) vergessen haben. Das merkt der DOM-Parser.

                                                                                                    Tschüss
                                                                                                    TS

                                                                                                    1. ich hatte es ja so gemacht (auf der jeweiligen Unterseite):

                                                                                                      foreach ($xPath->query('//div/p') as $node2) {
                                                                                                      
                                                                                                2. Entschuldige, wenn ich noch mal mit einem wahrscheinlich dummen Problem komme. Ich habe jetzt das sr-online-abholen in eine function gepackt um mir dann den Inhalte der description zurückgeben zu lassen. Offenbar mache ich etwas falsch oder habe was nicht kapiert beim "return".

                                                                                                  <?php function srholen ($url, $zaehler)
                                                                                                  {
                                                                                                  
                                                                                                  $data = file_get_contents($url);
                                                                                                  $meta = '<?xml encoding="UTF-8" ?'.'>' . "\r\n";  
                                                                                                  
                                                                                                          $dom = new DOMDocument('1.0', 'utf-8');
                                                                                                          $dom->encoding = 'utf-8';
                                                                                                          $dom->validateOnParse = true;
                                                                                                          $dom->strictErrorChecking = true ;
                                                                                                          $dom->preserveWhiteSpace = true;
                                                                                                  
                                                                                                  
                                                                                                          $dom->loadHTML($meta . $data);
                                                                                                  
                                                                                                  
                                                                                                  $xPath = new DOMXPath($dom);
                                                                                                  foreach ($xPath->query('//div/p') as $node2) {
                                                                                                  if (($zaehler <= 10)&& ($node2->nodeValue !== '') && ($node2->nodeValue !== NULL)){
                                                                                                  $rueckgabe = $node2->nodeValue;
                                                                                                  
                                                                                                  return $rueckgabe;
                                                                                                  
                                                                                                  }
                                                                                                  }
                                                                                                  }
                                                                                                  ?>
                                                                                                  

                                                                                                  Wenn ich vor dem return den Inhalt von $rueckgabe ausgeben lasse, ist alles drin, nach dem Aufrufen der Funktion ist nichts drin.

                                                                                                  srholen ('http://www.sr-online.de/sronline/nachrichten/hoerfunknachrichten/hoerfunknachrichten_aktuell100~_seite-1.html',$zaehler);
                                                                                                  echo $rueckgabe;
                                                                                                  

                                                                                                  Woran kann denn das liegen?

                                                                                                  1. Hallo Leute,

                                                                                                    Entschuldige, wenn ich noch mal mit einem wahrscheinlich dummen Problem komme. Ich habe jetzt das sr-online-abholen in eine function gepackt um mir dann den Inhalte der description zurückgeben zu lassen. Offenbar mache ich etwas falsch oder habe was nicht kapiert beim "return".

                                                                                                    <?php function srholen ($url, $zaehler)
                                                                                                    {
                                                                                                    
                                                                                                        $data = file_get_contents($url);
                                                                                                        $meta = '<?xml encoding="UTF-8" ?'.'>' . "\r\n";  
                                                                                                    
                                                                                                        $dom = new DOMDocument('1.0', 'utf-8');
                                                                                                        $dom->encoding = 'utf-8';
                                                                                                        $dom->validateOnParse = true;
                                                                                                        $dom->strictErrorChecking = true ;
                                                                                                        $dom->preserveWhiteSpace = true;
                                                                                                    
                                                                                                    
                                                                                                        $dom->loadHTML($meta . $data);
                                                                                                    
                                                                                                    
                                                                                                        $xPath = new DOMXPath($dom);
                                                                                                        foreach ($xPath->query('//div/p') as $node2) 
                                                                                                        {
                                                                                                            if (($zaehler <= 10) && ($node2->nodeValue !== '') && ($node2->nodeValue !== NULL))
                                                                                                            {
                                                                                                                $rueckgabe = $node2->nodeValue;
                                                                                                    
                                                                                                    ## Das verstehe ich hier sowieso nicht: Bei return ist foreach() zuende.
                                                                                                    ## Und wofür benötigst Du den Zähler? 
                                                                                                    
                                                                                                                return $rueckgabe;
                                                                                                    
                                                                                                            }
                                                                                                        }
                                                                                                    }
                                                                                                    ?>
                                                                                                    

                                                                                                    Wenn ich vor dem return den Inhalt von $rueckgabe ausgeben lasse, ist alles drin, nach dem Aufrufen der Funktion ist nichts drin.

                                                                                                    srholen ('http://www.sr-online.de/sronline/nachrichten/hoerfunknachrichten/hoerfunknachrichten_aktuell100~_seite-1.html',$zaehler);
                                                                                                    echo $rueckgabe;
                                                                                                    

                                                                                                    Woran kann denn das liegen?

                                                                                                    Hier sollte es wohl besser heißen:

                                                                                                    $rueckgabe = srholen ('http://www.sr-online.de/sronline/nachrichten/hoerfunknachrichten/hoerfunknachrichten_aktuell100~_seite-1.html',$zaehler);
                                                                                                    
                                                                                                    echo $rueckgabe; 
                                                                                                    

                                                                                                    oder auch in einem Schritt gleich

                                                                                                    echo htmlspecialchars(srholen ('http://www.sr-online.de/sronline/nachrichten/hoerfunknachrichten/hoerfunknachrichten_aktuell100~_seite-1.html',$zaehler));
                                                                                                    

                                                                                                    Tschüss
                                                                                                    TS

                                                                                                    1. Danke Danke Danke!

                                                                                                      1. Hallo

                                                                                                        Danke Danke Danke!

                                                                                                        Du solltest aber auch auf TS' Frage, die er in deinen Quelltext einfügte, antworten.

                                                                                                        ## Das verstehe ich hier sowieso nicht: Bei return ist foreach() zuende.
                                                                                                        ## Und wofür benötigst Du den Zähler? 
                                                                                                        

                                                                                                        Deine Funktion riecht ganz stark danach, für jeden der Teaser einen eigenen Funktionsaufruf durchzuführen und damit für jeden Teaser das Dokument erneut zu parsen. Kannst du bitte noch einmal mit deinen Worten erklären, wie deine Funktion arbeitet?

                                                                                                        Tschö, Auge

                                                                                                        --
                                                                                                        Es schimmerte ein Licht am Ende des Tunnels und es stammte von einem Flammenwerfer.
                                                                                                        Terry Pratchett, „Gevatter Tod“
                                                                                                        1. Hallo

                                                                                                          Danke Danke Danke!

                                                                                                          Du solltest aber auch auf TS' Frage, die er in deinen Quelltext einfügte, antworten.

                                                                                                          ## Das verstehe ich hier sowieso nicht: Bei return ist foreach() zuende.
                                                                                                          ## Und wofür benötigst Du den Zähler? 
                                                                                                          

                                                                                                          Deine Funktion riecht ganz stark danach, für jeden der Teaser einen eigenen Funktionsaufruf durchzuführen und damit für jeden Teaser das Dokument erneut zu parsen.

                                                                                                          Ich hatte die Frage übersehen, angesichts der (erfreulich) vielen Reaktionen ja auch nicht verwunderlich. Ich habe das Ganze jetzt ohnehin erst in eine Funktion gepackt, vorher stand das alles jeweils untereinander, ABER leider stehen die Teaser - Texte ja auf verschiedenen Seiten, so dass die Funktion jeweils eine neue Seite parsen muss. Das sieht jetzt so aus:

                                                                                                          <?php function srholen ($url, $zaehler)
                                                                                                          {
                                                                                                          
                                                                                                          $data = file_get_contents($url);
                                                                                                          $meta = '<?xml encoding="UTF-8" ?'.'>' . "\r\n";  
                                                                                                          
                                                                                                                  $dom = new DOMDocument('1.0', 'utf-8');
                                                                                                                  $dom->encoding = 'utf-8';
                                                                                                                  $dom->validateOnParse = true;
                                                                                                                  $dom->strictErrorChecking = true ;
                                                                                                                  $dom->preserveWhiteSpace = true;
                                                                                                          
                                                                                                          
                                                                                                                  $dom->loadHTML($meta . $data);
                                                                                                          
                                                                                                          
                                                                                                          $xPath = new DOMXPath($dom);
                                                                                                          foreach ($xPath->query('//div/p') as $node2) {
                                                                                                          if (($zaehler <= 10)&& ($node2->nodeValue !== '') && ($node2->nodeValue !== NULL)){
                                                                                                          $array[$zaehler] = $node2->nodeValue;
                                                                                                          
                                                                                                          return $array[$zaehler];
                                                                                                          
                                                                                                          }
                                                                                                          }
                                                                                                          }
                                                                                                          ?>
                                                                                                          

                                                                                                          und im HTML wir das so aufgerufen:

                                                                                                          
                                                                                                          <?php 
                                                                                                          $zaehler=0;
                                                                                                          $array[$zaehler] = srholen ('http://www.sr-online.de/sronline/nachrichten/hoerfunknachrichten/hoerfunknachrichten_aktuell100~_seite-1.html',$zaehler);
                                                                                                          $zaehler++;
                                                                                                          $array[$zaehler] = srholen ('http://www.sr-online.de/sronline/nachrichten/hoerfunknachrichten/hoerfunknachrichten_aktuell100~_seite-2.html', $zaehler);
                                                                                                          $zaehler++;
                                                                                                          $array[$zaehler] = srholen ('http://www.sr-online.de/sronline/nachrichten/hoerfunknachrichten/hoerfunknachrichten_aktuell100~_seite-3.html', $zaehler);
                                                                                                          $zaehler++;
                                                                                                          

                                                                                                          usw.

                                                                                                          Ich bin mit sicher, auch das geht noch eleganter, auf jeden Fall werden so die Teasertexte zusammengeholt und in ein array gepackt, später dann links und titles von der Indexseite und zusammen ausgegeben...

                                                                                                          Gruß glupto

                                                                                                          1. Hallo und guten Morgen,

                                                                                                            Deine Funktion riecht ganz stark danach, für jeden der Teaser einen eigenen Funktionsaufruf durchzuführen und damit für jeden Teaser das Dokument erneut zu parsen.

                                                                                                            Das geht hier wohl tatsächlich nicht viel anders. Sieht man auch in meinem Lösungsvorschlag in
                                                                                                            http://forum.selfhtml.org/self/2015/jun/11/htmlentities-bereinigen/1643075#m1643075

                                                                                                            Dort hole ich erst mit der Funktion get_links($node) die Linkliste und schreibe sie in ein Array

                                                                                                            $_links[$index]['href']
                                                                                                            $_linkls[$index]['linktext']
                                                                                                            

                                                                                                            Da die Anzahl der Links in dem Bereich immer variiert (zwischen vier und sieben habe ich bishe gesehen) und die dazugehörigen Seiten mit den Teasern leider auch öfter mal eine geringfügig andere HTML-Auszeichnung haben, muss man das Grabben hier möglichst flexibel halten.

                                                                                                            Anschließend werden mit Hilfe der Linkliste die Einzelseiten nochmal aufgerufen (einen Request könnte man da noch einsparen) und die Überschriften und der Teasertext ausgelesen und ebenfalls in das Array eingetragen.

                                                                                                            Wenn man das Array dann zusammengesammelt hat, kann es an die Ausgabe weitergereicht werden

                                                                                                            Für die Touch-Display-Version würde ich übrigens einen kleinen Extralink am Teaserlink anbringen, mit dem man die Teaserbox öffnen kann und in dieser dann ein Schließkreuz unterbringen und einen Link auf die Originalseite. Wahrscheinlich würde der auch bei der Desktopversion gar nicht stören. Übrigens hat Jeena P. mit seiner Bildergalerie http://forum.selfhtml.org/self/2015/jun/15/viele-thumbnails-schneller-laden-und-darstellen/1643106#m1643106
                                                                                                            ein ähnliches Problem.

                                                                                                            In meinem Demoscript habe ich zusätzlich für Debuggingzwecke noch die XPathes der im betroffenen Container vorhandenen Elemente gesammelt, weil man mit deren Hilfe die temporären Änderungen am Markup am besten erkennen kann. Das kann man für die operative Version natürlich wieder rausschmeißen oder eben einfach nicht benutzen.

                                                                                                            Glupto, lade dir das Script doch einfach mal auf deinen Testserver. Es müsste eigentlich sofort funktionieren, wenn der ins Internet darf.

                                                                                                            Generell würden mich hier jetzt noch noch drei Dinge interessieren:

                                                                                                            • Die Fehlertoleranz für die Grabberlösung erhöhen
                                                                                                            • Wann und wie sollte man auf Fehler im laufenden Betrieb reagieren und wie erkennt man die?
                                                                                                            • Wie kann man mittels JavaScript in einer gegebenen (fremden) Webseite einen Bereich markieren und das Markup und die Nodes im DOM identifizieren? Das Ergebnis soll dann für das eigene Backend zur Verfügung stehen...

                                                                                                            Grüße
                                                                                                            TS

                                                                                                            1. Also, ich habe das Script jetzt 1 zu 1 kopiert und hochgeladen und laufen lassen, bisher kommt gar nix. Werde es mal im Detail durchschauen.

                                                                                                              An das Schließkreuz am Teaser hatte ich schon gedacht, hatte das dann aber erstmal aufgeschoben, der Link ist ja bei "...mehr" schon drin. Aber die Öffnung des Teasers ohne extra Symbol sondern einfach durch drauftippen finde ich gar nicht so schlecht. Ein Extra-Symbol nimmt nur wieder Platz weg.

                                                                                                              Was ich viel lieber hätte, wäre eine Möglichkeit für die Nutzer, sich selbst die Medien auszusuchen und ob Teaser oder nicht und wieviel Schlagzeilen - und das alles nur per Cookie ohne Datenbank.... Aber dazu fehlen mir Kenntnisse in Cookie - Setzung und Abrufen...

                                                                                                              1. Hallo und schönen Mittag,

                                                                                                                Also, ich habe das Script jetzt 1 zu 1 kopiert und hochgeladen und laufen lassen, bisher kommt gar nix. Werde es mal im Detail durchschauen.

                                                                                                                Das ist ein bisschen wenig. :-O

                                                                                                                können wir die Seite auch aufrufen? Dann gib uns meine URL und setz doch oben über die Zeile mit header() mal

                                                                                                                error_reporting(E_ALL);
                                                                                                                ini_set('display_errors', 1);
                                                                                                                

                                                                                                                rein. dann müssten Fehlermeldungen kommen.
                                                                                                                Vielleicht ist allow_url_fopen nicht of ON?

                                                                                                                Grüße
                                                                                                                TS

                                                                                                                1. ach, die Formatierungen waren nicht mitgekommen, so dass er nur Murks zur Verarbeitung hat - ich muss nachher zuhause mal das Ganze in den notepad-editor kopieren, den habe ich hier auf der Arbeit nicht.

                                                                                                            2. Für die Touch-Display-Version würde ich übrigens einen kleinen Extralink am Teaserlink anbringen, mit dem man die Teaserbox öffnen kann und in dieser dann ein Schließkreuz unterbringen und einen Link auf die Originalseite. Wahrscheinlich würde der auch bei der Desktopversion gar nicht stören. Übrigens hat Jeena P. mit seiner Bildergalerie http://forum.selfhtml.org/self/2015/jun/15/viele-thumbnails-schneller-laden-und-darstellen/1643106#m1643106
                                                                                                              ein ähnliches Problem.

                                                                                                              Ich hatte übrigens zum Thema tooltip-schließkreuz hier schon mal was gepostet, aber leider keine Antwort bekommen...

                                                                                                              Linkbeschreibung

                                                                                                          2. Hallo

                                                                                                            Ich hatte die Frage übersehen, angesichts der (erfreulich) vielen Reaktionen ja auch nicht verwunderlich. Ich habe das Ganze jetzt ohnehin erst in eine Funktion gepackt, vorher stand das alles jeweils untereinander, ABER leider stehen die Teaser - Texte ja auf verschiedenen Seiten, so dass die Funktion jeweils eine neue Seite parsen muss.

                                                                                                            Du rufst die Funktion also einmal pro Quell-URL auf. Das passt schon. Bleibt also die Frage nach der Übergabe von $zaehler an die Funktion als Parameter. $zaehler stellt, wenn ich deinen Code richtig interpretiere, sicher, dass nur von elf Seiten (0 bis 10) Teaser eingesammelt werden und stellt zudem den Index für das dabei befüllte Array bereit.

                                                                                                            und im HTML wir das so aufgerufen:

                                                                                                            
                                                                                                            <?php 
                                                                                                            $zaehler=0;
                                                                                                            $array[$zaehler] = srholen ('http://www.sr-online.de/sronline/nachrichten/hoerfunknachrichten/hoerfunknachrichten_aktuell100~_seite-1.html',$zaehler);
                                                                                                            $zaehler++;
                                                                                                            $array[$zaehler] = srholen ('http://www.sr-online.de/sronline/nachrichten/hoerfunknachrichten/hoerfunknachrichten_aktuell100~_seite-2.html', $zaehler);
                                                                                                            $zaehler++;
                                                                                                            $array[$zaehler] = srholen ('http://www.sr-online.de/sronline/nachrichten/hoerfunknachrichten/hoerfunknachrichten_aktuell100~_seite-3.html', $zaehler);
                                                                                                            $zaehler++;
                                                                                                            

                                                                                                            Ich bin mit sicher, auch das geht noch eleganter, auf jeden Fall werden so die Teasertexte zusammengeholt und in ein array gepackt, später dann links und titles von der Indexseite und zusammen ausgegeben...

                                                                                                            Trifft meine oben aufgestellte These zum Zweck von $zaehler zu oder ist da noch etwas?

                                                                                                            Falls nicht, kannst du $zaehler „draußen“ (außerhalb der Funktion) lassen und dort die Beschränkung auf Werte von 0 bis 10 sicherstellen. Du brauchst dann „nur noch“ eine mit dem Zähler korrelierende Datenstruktur für die URLs der Datenquellen.

                                                                                                            # Auflistung der URLs als Array
                                                                                                            $srQuellURLs = array("http://www.sr-online.de/sronline/nachrichten/hoerfunknachrichten/hoerfunknachrichten_aktuell100~_seite-1.html",
                                                                                                              "http://www.sr-online.de/sronline/nachrichten/hoerfunknachrichten/hoerfunknachrichten_aktuell100~_seite-2.html",
                                                                                                              "http://www.sr-online.de/sronline/nachrichten/hoerfunknachrichten/hoerfunknachrichten_aktuell100~_seite-3.html",
                                                                                                              "…");
                                                                                                            
                                                                                                            # (Pflege-)Wir zählen bis 10
                                                                                                            for ($zaehler = 0; $zeahler >= 10; $zeahler++) {
                                                                                                              # der Wert von $zaehler gilt gleichermaßen für das URL-Array als auch für das Ergebnisarray 
                                                                                                              $array[$zaehler] = srholen($srQuellURL[$zaehler]);
                                                                                                            }
                                                                                                            

                                                                                                            In der Funktion kannst du dafür im If-Statement die Bedingung ($zaehler <= 10) weglassen.

                                                                                                            Tschö, Auge

                                                                                                            --
                                                                                                            Es schimmerte ein Licht am Ende des Tunnels und es stammte von einem Flammenwerfer.
                                                                                                            Terry Pratchett, „Gevatter Tod“
                                                                                                            1. Danke, ja, das ist eleganter. Der Zaehler ist wirklich nur zum Befüllen des Teaser-Arrays da und später für die Zuordnung der Teasertexte zum title und Link.

                                                                                        2. Moin!

                                                                                          Privat kann man Die keine Nachricht senden, deshalb so:

                                                                                          Ich weiss auch, das Drängeln unhöflich ist, ich bin ganz scharf darauf, dass dieses jemand mit XAMPP probiert.

                                                                                          Jörg Reinholz

                                                                                          1. Hallo Jörg Reinholz,

                                                                                            Privat kann man Die keine Nachricht senden, deshalb so:

                                                                                            Dieses Forum bietet die Möglichkeit, private Nachrichten zu senden?!

                                                                                            Bis demnächst
                                                                                            Matthias

                                                                                            --
                                                                                            Signaturen sind bloed (Steel) und Markdown ist mächtig.
                                                                                          2. Moin!

                                                                                            Privat kann man Die keine Nachricht senden, deshalb so:

                                                                                            Doch, an ts-self@online.de

                                                                                            Ich weiss auch, das Drängeln unhöflich ist, ich bin ganz scharf darauf, dass dieses jemand mit XAMPP probiert.

                                                                                            Wenn ich nachher noch Zeit habe, spiele ich damit ;-)
                                                                                            Was speziell soll denn gestestet werden?

                                                                                            Ich kämpfe derzeit noch mit meinem Linux und der kaputten Festplatte.

                                                                                            Wie kann ich mit cp alle Dateien eines Verzeichnisses kopieren (auf die andere Platte), inclusive der versteckten, aber nur dann, wenn die Quelldatei neuer ist?

                                                                                            Ich hab alles vergessen, glaub ich. Grafische Oberflächen und Hilfsprogramme machen dumm :-O

                                                                                            Grüße
                                                                                            TS

                                                                                            1. Moin!

                                                                                              Wie kann ich mit cp alle Dateien eines Verzeichnisses kopieren (auf die andere Platte), inclusive der versteckten, aber nur dann, wenn die Quelldatei neuer ist?

                                                                                              cd /tmp
                                                                                              mkdir test
                                                                                              cd test
                                                                                              cp -au /home/ts ./
                                                                                              
                                                                                              • -a archive
                                                                                              • -u nur neuere
                                                                                              • /home/ts - Verzeichnis mit Inhalt - legt aber Verzeichnis an

                                                                                              Variante mit Trick:

                                                                                              cp -u /home/ts/* /home/ts/.* /tmp/test/
                                                                                              

                                                                                              weitere, extrem vorteilhafte Variante:

                                                                                              rsync quelle ziel
                                                                                              
                                                                                              • kennt viele Optionen, geht auch über das Netz (ssh)

                                                                                              Jörg Reinholz

                                                                                        3. Hallo

                                                                                          header('Content-Type: text/html; CharSet="utf-8">');
                                                                                          

                                                                                          Was mich bei deinen Beispielen kirre gemacht hat, ist die obige Zeile. Die wirkt, als hättest du sie falsch markiert aus einem HTML-Dokument entliehen. Die hier passt (Korrekturen: Anführungszeichen, Doppelpunkt vs. Gleichheitszeichen).

                                                                                          header('Content-Type: text/html; charset: UTF-8');
                                                                                          

                                                                                          Tschö, Auge

                                                                                          --
                                                                                          Es schimmerte ein Licht am Ende des Tunnels und es stammte von einem Flammenwerfer.
                                                                                          Terry Pratchett, „Gevatter Tod“
                                                                                          1. Also bei stand bis eben:

                                                                                            header("Content-Type: text/html; charset=UTF-8");
                                                                                            
                                                                                            
                                                                                            

                                                                                            Mit dem Doppelpunkt hast Du natürlich recht!

                                                                                            1. Hallo

                                                                                              header("Content-Type: text/html; charset=UTF-8");
                                                                                              

                                                                                              Mit dem Doppelpunkt hast Du natürlich recht!

                                                                                              Das ist auch eher eine Anmerkung für's Archiv. Natürlich kann es dort immer noch jemand falsch abgeschrieben werden, es steht aber noch einmal richtig dort herinnen. Falls sich einstmals jemand mit der Medaille Antworten editieren daran erinnert, kann der Fehler auch direkt in TS' Antworten behoben werden.

                                                                                              Tschö, Auge

                                                                                              --
                                                                                              Es schimmerte ein Licht am Ende des Tunnels und es stammte von einem Flammenwerfer.
                                                                                              Terry Pratchett, „Gevatter Tod“
                                                                                              1. Wenn wir schon über's Kopieren reden: Vielleicht könntest Du Dir das hier am Seitenbeginn mal anschauen:

                                                                                                ini_set("user_agent", "Mozilla/5.0 (compatible; Feedreader/PHP +".$_SERVER["HTTP_HOST"].$_SERVER["PHP_SELF"].")");
                                                                                                

                                                                                                Das hatte mir jemand mal empfohlen, aber ich habe es eigentlich nicht richtig verstanden, wozu ich diese Einstellungen setze. Ich weiß, das sollte ich...Aber ich habe mich da eben als php-Laie rangesetzt und war (und bin) auf Hilfe angewiesen.

                                                                                                Gruß und Dank glupto

                                                                                                1. Hallo

                                                                                                  ini_set("user_agent", "Mozilla/5.0 (compatible; Feedreader/PHP +".$_SERVER["HTTP_HOST"].$_SERVER["PHP_SELF"].")");
                                                                                                  

                                                                                                  Das hatte mir jemand mal empfohlen, aber ich habe es eigentlich nicht richtig verstanden, wozu ich diese Einstellungen setze.

                                                                                                  Was ini_set macht, sagt dir das Handbuch. Kurze Zusammenfassung: Mit ini_set verändert man zur Skriptlaufzeit Einstellungen aus der php.ini. In der Liste der veränderbaren Einstellungen findet sich auch user_agent.

                                                                                                  Wenn du also mit, wie z.B. mit deiner Funktion, z.B. per HTTP(S) auf eine Seite zugreifst, wird, wie es auch ein Browser tut, bei der Anfrage eine User-Agent-Kennung mitgeschickt. Manche Serverbetreiber versuchen so für bestimmte Anfragen Such- aber allgemein insbesondere Spam-Robots abzufangen. Um seinen Zweck zu erfüllen soll hier also ein mehr oder minder unverdächtiger User-Agent-String geschickt werden.

                                                                                                  Deiner gibt korrekt die Quelle der Anfrage (ein als PHP-Skript laufender Feedreader, die vollständige URL des anfragenden Skriptes) an. Dass man da auch nicht Existentes vorgaukeln kann, sollte klar sein. Man kann dort schließlich hineinschreiben, was man will.

                                                                                                  Ich weiß, das sollte ich...Aber ich habe mich da eben als php-Laie rangesetzt und war (und bin) auf Hilfe angewiesen.

                                                                                                  Vergiss dennoch nicht, dich mit den Grundlagen zu beschäftigen. Das heißt nicht, dass du das allein tun musst, aber schlussendlich ist alles, was du selbst weißt, sowohl für dich als dieses Wissen Anwendender als auch für potentielle Fragen beanwortende „Mitspieler“ entlastend.

                                                                                                  Tschö, Auge

                                                                                                  --
                                                                                                  Es schimmerte ein Licht am Ende des Tunnels und es stammte von einem Flammenwerfer.
                                                                                                  Terry Pratchett, „Gevatter Tod“
                                                                                                2. Moin!

                                                                                                  ini_set("user_agent", "Mozilla/5.0 (compatible; Feedreader/PHP +".$_SERVER["HTTP_HOST"].$_SERVER["PHP_SELF"].")");
                                                                                                  

                                                                                                  Das hatte mir jemand mal empfohlen, aber ich habe es eigentlich nicht richtig verstanden, wozu ich diese Einstellungen setze. Ich weiß, das sollte ich...Aber ich habe mich da eben als php-Laie rangesetzt und war (und bin) auf Hilfe angewiesen.

                                                                                                  Diese Angabe landet in den Log-Files des Anbieters der über das Web abgeholten Ressource und hat technische und dann auch juristische Folgen:

                                                                                                  A) Technik

                                                                                                  Der Anbieter hat die Möglichkeit den Zugriff explizit zu erlauben oder zu verhindern.

                                                                                                  B) Juristische

                                                                                                  Möglicher Sachstand:

                                                                                                  • Nehmen wir mal an, das Abholen der Ressource und die Weiterverarbeitung beträfe rechtlich geschützte Inhalte und wäre (womöglich) nicht rechtens.
                                                                                                  • Der Anbieter lässt Dich abmahnen - mit einer Rechnung von 1800 €.
                                                                                                  • Der Anbieter sperrt aber den Zugriff nicht.
                                                                                                  • Du reagierst zunächst nicht auf die Abmahnung, weil Du gerade im Urlaub bist.
                                                                                                  • Der Anbieter holt sich eine Einstweilige Verfügung.
                                                                                                  • Du argumentierst vor Gericht, dass zumindest die Eilbedürftigkeit nicht gegeben sein dürfte, weil der Anbieter den schnellsten, billigsten und offensichtlichsten Weg, nämlich die technische Sperre durch einen einfachen Eintrag in .htaccess nicht vorgenommen habe, sondern erst abmahnte und dann die EV beantragte.
                                                                                                  • Du gibst fix die Unterlassungserklärung ab.

                                                                                                  Deine mögliches Argumentation:

                                                                                                  1. Die behauptete Eilbedürftigkeit war tatsächlich nicht gegeben, weil der Antragsteller die zumutbare und einfache Sperre nicht vornahm.
                                                                                                  2. Ergo könne auch der Eingriff in seine Rechte nicht so schwerwiegend gewesen sein, dass dieses eine Klage zu einem Streitwert von trentiquilliarden Euro rechtfertige - denn wenn er den Schaden behauptet, dann hätte er den Abruf verhindert.
                                                                                                  3. Der Antragsteller will zusammen mit seinem Anwalt nur abzocken, sonst hätte er ja auch gesperrt (nett, wenn mehrere das Problem mit dem Anbieter haben)...

                                                                                                  Mögliche Folgen:

                                                                                                  1. Das Gericht weisst den Antrag auf den Erlass der Einstweiligen Verfügung wegen Rechtsmissbrauchs zurück.
                                                                                                  2. Das Gericht legt den Streitwert sehr viel niedriger fest als sich das der Gegner-Anwalt gewünscht hätte.
                                                                                                  3. Das Gericht ordnet dem Gegner die Kosten für die Abwehr der zu hohen Kostenforderung für die Abmahnung zu.

                                                                                                  Darauf würde ich vor dem Land- (und Rechtsmissbrauchs-) Gerichten Hamburg, Berlin, Köln aber nicht wetten. Vor anderen Gerichten wäre es durchaus möglich.

                                                                                                  Zwingende Folge der schnell abgegebenen Unterlassungserklärung

                                                                                                  Auch wenn manche Richter in Deutschland den Job auf eine Weise machen, dass man sie in der Wirtschaft achtkantig feuern würde, bietet die Einstellung also gewisse Chancen.

                                                                                                  Jörg Reinholz

                                                                                          2. Hallo und guten Morgen,

                                                                                            header('Content-Type: text/html; CharSet="utf-8">');
                                                                                            

                                                                                            Was mich bei deinen Beispielen kirre gemacht hat, ist die obige Zeile. Die wirkt, als hättest du sie falsch markiert aus einem HTML-Dokument entliehen. Die hier passt (Korrekturen: Anführungszeichen, Doppelpunkt vs. Gleichheitszeichen).

                                                                                            header('Content-Type: text/html; charset: UTF-8');
                                                                                            

                                                                                            Danke, ich habe es bei mir korrigiert.
                                                                                            Ein Wunder, dass es keinen Fehler gab.

                                                                                            Grüße
                                                                                            TS

                                                                                            1. Hallo

                                                                                              header('Content-Type: text/html; charset: UTF-8');
                                                                                              

                                                                                              Danke, ich habe es bei mir korrigiert.
                                                                                              Ein Wunder, dass es keinen Fehler gab.

                                                                                              Ich vermute, dass der Server von sich aus ebenfalls einen entsprechenden Header schickte und dein „kaputter“ günstigstenfalls vom Browser ignoriert und stillschweigend durch den des Servers ersetzt wurde.

                                                                                              Tschö, Auge

                                                                                              --
                                                                                              Es schimmerte ein Licht am Ende des Tunnels und es stammte von einem Flammenwerfer.
                                                                                              Terry Pratchett, „Gevatter Tod“
                                                                                          3. Hallo und guten Morgen,

                                                                                            header('Content-Type: text/html; CharSet="utf-8">');
                                                                                            

                                                                                            Was mich bei deinen Beispielen kirre gemacht hat, ist die obige Zeile. Die wirkt, als hättest du sie falsch markiert aus einem HTML-Dokument entliehen. Die hier passt (Korrekturen: Anführungszeichen, Doppelpunkt vs. Gleichheitszeichen).

                                                                                            header('Content-Type: text/html; charset: UTF-8');
                                                                                            

                                                                                            Richtig ist:

                                                                                               header('Content-Type: text/html; CharSet="utf-8"');
                                                                                            

                                                                                            oder

                                                                                               header('Content-Type: text/html; CharSet=utf-8');
                                                                                            

                                                                                            oder auch

                                                                                               header('Content-Type: text/html; charset=UTF-8');
                                                                                            

                                                                                            aber keinesfalls mit Doppelpunkt bei der Angabe des CharSet.

                                                                                            Vielleicht liest ja ein RFC-Kundiger mit, der die genaue Stelle kennt?

                                                                                            Grüße
                                                                                            TS

                                                                                            1. Hallo

                                                                                              header('Content-Type: text/html; charset: UTF-8');
                                                                                              

                                                                                              Richtig ist:

                                                                                                 header('Content-Type: text/html; CharSet="utf-8"');
                                                                                              

                                                                                              Nö.

                                                                                              oder

                                                                                                 header('Content-Type: text/html; CharSet=utf-8');
                                                                                              

                                                                                              Ja.

                                                                                              oder auch

                                                                                                 header('Content-Type: text/html; charset=UTF-8');
                                                                                              

                                                                                              Ja.

                                                                                              aber keinesfalls mit Doppelpunkt bei der Angabe des CharSet.

                                                                                              Korrekt. Sorry für die halbfalsche Fährte.

                                                                                              Tschö, Auge

                                                                                              --
                                                                                              Es schimmerte ein Licht am Ende des Tunnels und es stammte von einem Flammenwerfer.
                                                                                              Terry Pratchett, „Gevatter Tod“
                                                                                            2. Tach,

                                                                                              Vielleicht liest ja ein RFC-Kundiger mit, der die genaue Stelle kennt?

                                                                                              RFC 2616, Kapitel 14.17, 3.4 und 3.7

                                                                                              mfg
                                                                                              Woodfighter

                                                                                              1. Tach,

                                                                                                Vielleicht liest ja ein RFC-Kundiger mit, der die genaue Stelle kennt?

                                                                                                RFC 2616, Kapitel 14.17, 3.4 und 3.7

                                                                                                Jetzt https://tools.ietf.org/html/rfc7231 ff

                                                                                                Abschnitt 3.1.1.1 ff

                                                                                                Ciao RS

                                                                                                1. Tach,

                                                                                                  RFC 2616, Kapitel 14.17, 3.4 und 3.7

                                                                                                  Jetzt https://tools.ietf.org/html/rfc7231 ff

                                                                                                  Abschnitt 3.1.1.1 ff

                                                                                                  danke, das lerne ich wohl nicht mehr und warte stattdessen direkt auf HTTP/2.

                                                                                                  mfg
                                                                                                  Woodfighter

                                              2. Tach!

                                                Hier habe ich es so gemacht, wie Du vorschlägst - zufällig ist es auch wieder ein Text mit den ominösen Anführungszeichen:

                                                Die+Stadtverwaltung+hat+die+Baugenehmigung+f%C3%83%C2%BCr+das+geplante+Gro%C3%83%C2%9Fbordell+im+V%C3%83%C2%B6lklinger+Stadtteil+Fenne+erteilt.
                                                

                                                Da sieht man, dass da 4 Bytes für Umlaute verwendet wurden. Da ist also schon eine doppelte UTF-8-Kodierung in den Daten. Das kann passieren, wenn man UTF-8 mit utf8encode() behandelt.

                                                Ausgegeben wird das bei mir mit utf8_decode:

                                                Das umstrittene Bordell soll in der ehemaligen ?Glashüttenhalle??entstehen.

                                                Ja, dazu die Daten sehen so aus: > Das+umstrittene+Bordell+soll+in+der+ehemaligen+%E2%80%9EGlash%C3%83%C2%BCttenhalle%E2%80%9C%E2%80%82entstehen

                                                Das erste Anführungszeichen ist dieses da, Bytefolge: E2 80 9E. Das kann utf8decode() nicht in ISO-8859-1 umkodieren, weil es dieses Zeichen in der Kodierung nicht gibt. Resultat ist dann ein Fragezeichen.

                                                Bemerkenswert ist, dass das Anführungszeichen einfach UTF-8-kodiert ist, während die Umlaute zweifach kodiert sind. Aber war es nicht so, dass Umlaute direkt im Code der Seite standen und die Anführungszeichen als Entity? Da hat jemand die Entitys weginterpretiert (die DOM-Funktionen vermutlich). Und davor fand vermutlich eine überflüssige UTF-8-Kodierung von bereits UTF-8-Daten statt.

                                                dedlfix.

                                          2. Tach!

                                            Das kommt bei echo URLENCODE, das direkt nach file_get_contents erfolgte:

                                            Schön wäre es noch gewesen, wenn du die URL dazu genannt hättest. Ich wusste nämlich grad nicht, welcher Text da steht, den ich hätte in der Ausgabe suchen können. Gefunden habe ich aber diese Stelle

                                            SR-online%3A+H%C3%B6rfunknachrichten%2C+12.06.2015+12%3A10+Uhr

                                            Übersetzt heißt das: SR-online: Hörfunknachrichten, 12.06.2015 12:10 Uhr
                                            Zu sehen ist das ö als %C3%B6, also offensichtlich UTF-8-kodiert.

                                            Finden kann man das in dem urlencode-Wust, wenn man nach zum Beispiel rfunkn sucht, also ohne ö, von dem man nicht weiß, wie es kodiert sein wird.

                                            Besser wäre es, genau nach dem Text suchen zu können, den du nach deinem nächsten Schritt extrahierst. Problematische Zeichen sollte er enthalten, damit man die dann als vorher und nachher vergleichen kann.

                                            dedlfix.

                                      2. Tach!

                                        das urlencode ergibt sehr viele Zeichen, die mir aber so ohne weiteres nicht weiterhelfen.

                                        Es gibt dir den Text aus, der sollte relativ gut lesbar sein. Zumindest der normale Text ohne Umlaute muss zu erkenen sein. Satzzeichen und Umlaute werde von urlencode() in URL-Kodierung (prozentkodiert) dargestellt. Die Alternative dazu wäre bin2hex(), aber da kann man gar nichts im Klartext erkennen, nur die Bytewerte.

                                        file_get_contents() liefert dir HTML-Code. Darin sind recht viele Nicht-Buchstaben enthalten. Die werden natürlich von urlencode() prozentkodiert. Große Teile davon interessieren nicht weiter, nur die Stellen, an denen deine Nutzdaten stehen. Such dir im Original einfach eine signifikante Textstelle, in dessen Nähe ein Umlaut vorkommt. Such diese in der Ausgabe und dann schau wie der Umlaut aussieht. Dann gehts weiter mit deiner Verarbeitung und dem Prüfen, was daraus kommt. Gegebenenfalls vorher und nachher ausgeben lassen, nicht dass du einen Zwischenschritt zur vorhergehenden Verarbeitung übersehen hast.

                                        dedlfix.

                              2. Hallo

                                Wenn ich anschließend den Inhalt von $node2->nodeValue mit var_dump ausgebe, kommt schon Umlaut-Müll heraus.

                                Klar. Weil deine Header-Daten sagen "ich bin UTF-8" und die Daten unter http://www.sr....html offensichtlich nicht UTF-8 sind.

                                Hmm, ich rufe die SR-Seite auf. Der Header sagt laut Live HTTP headers, die Seite sei UTF-8-kodiert. Der Header sagt laut den Seiteninformationen, die mehrere Browser (Firefox, Chromium) liefern, die Seite sei UTF-8-kodiert. Die Umlaute werden mit der angegebenen Kodierung korrekt dargestellt, was darauf schließen lässt, dass die Angabe den tatsachen entspricht.

                                Tschö, Auge

                                --
                                Es schimmerte ein Licht am Ende des Tunnels und es stammte von einem Flammenwerfer.
                                Terry Pratchett, „Gevatter Tod“
                                1. Aloha ;)

                                  Klar. Weil deine Header-Daten sagen "ich bin UTF-8" und die Daten unter http://www.sr....html offensichtlich nicht UTF-8 sind.

                                  Hmm, ich rufe die SR-Seite auf. Der Header sagt laut Live HTTP headers, die Seite sei UTF-8-kodiert. Der Header sagt laut den Seiteninformationen, die mehrere Browser (Firefox, Chromium) liefern, die Seite sei UTF-8-kodiert. Die Umlaute werden mit der angegebenen Kodierung korrekt dargestellt, was darauf schließen lässt, dass die Angabe den tatsachen entspricht.

                                  Autsch, haut mich doch nicht alle xD dedlfix war schneller ;)

                                  Grüße,

                                  RIDER

                                  --
                                  Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller Erreichbar manchmal im Self-TS (ts.selfhtml.org) oder sonst - wenn online - auf dem eigenen TeamSpeak-Server (fritz.campingrider.de) oder unter: # Facebook # Twitter # Steam # YouTube # Self-Wiki # ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[
                              3. Klar. Weil deine Header-Daten sagen "ich bin UTF-8" und die Daten unter http://www.sr....html offensichtlich nicht UTF-8 sind.

                                Aber im header der sr-online-Seite wird das Ganze auch als utf8 deklariert. Oder ist der Quelltext da nicht zuverlässig als Angabe.

                                Was dedlfix dir sagen wollte ist, dass du irgendwo in deinem Skript zwischen dem Einlesen der Daten (was du aktuell mit file_get_contents tust) und der Ausgabe eine (korrekte) Konvertierung vornehmen musst. Dazu brauchst du zwei Informationen: das Eingabeformat (das musst du rausbekommen) und das Ausgabeformat (hier UTF-8).

                                ich hatte doch ursprünglich eine Ausgabe mit utf8-decode drin, die sorgt doch auch dafür, dass alle Umlaute korrekt dargestellt werden, nur halt die vermaledeiten Anführungsstriche nicht.

                                @Edit: Du könntest die Inhalte beispielsweise über http_get anfordern oder die Klassen HttpRequest/HttpMessage nutzen.

                                werde mich mal mit http_get usw befassen, hoffe, dass das dann auch nützt. Danke für die Hilfe!

                                1. Aloha ;)

                                  Klar. Weil deine Header-Daten sagen "ich bin UTF-8" und die Daten unter http://www.sr....html offensichtlich nicht UTF-8 sind.

                                  Aber im header der sr-online-Seite wird das Ganze auch als utf8 deklariert. Oder ist der Quelltext da nicht zuverlässig als Angabe.

                                  Du hast Recht, dahingehend war das eine Fehleinschätzung meinerseits.

                                  Was dedlfix dir sagen wollte ist, dass du irgendwo in deinem Skript zwischen dem Einlesen der Daten (was du aktuell mit file_get_contents tust) und der Ausgabe eine (korrekte) Konvertierung vornehmen musst. Dazu brauchst du zwei Informationen: das Eingabeformat (das musst du rausbekommen) und das Ausgabeformat (hier UTF-8).

                                  ich hatte doch ursprünglich eine Ausgabe mit utf8-decode drin, die sorgt doch auch dafür, dass alle Umlaute korrekt dargestellt werden, nur halt die vermaledeiten Anführungsstriche nicht.

                                  Naja, das ist ja auch Müll. utf8_decode erzeugt eine ISO-Zeichenkette aus UTF8 und du willst eine UTF8-Zeichenkette haben.

                                  @Edit: Du könntest die Inhalte beispielsweise über http_get anfordern oder die Klassen HttpRequest/HttpMessage nutzen.

                                  werde mich mal mit http_get usw befassen, hoffe, dass das dann auch nützt. Danke für die Hilfe!

                                  Der von dedlfix erwähnte (und mir bisher nicht bekannte) $http_response_header ist vielleicht die einfachere Alternative.

                                  Grüße,

                                  RIDER

                                  --
                                  Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller Erreichbar manchmal im Self-TS (ts.selfhtml.org) oder sonst - wenn online - auf dem eigenen TeamSpeak-Server (fritz.campingrider.de) oder unter: # Facebook # Twitter # Steam # YouTube # Self-Wiki # ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[
                                2. Hallo

                                  Klar. Weil deine Header-Daten sagen "ich bin UTF-8" und die Daten unter http://www.sr....html offensichtlich nicht UTF-8 sind.

                                  Aber im header der sr-online-Seite wird das Ganze auch als utf8 deklariert. Oder ist der Quelltext da nicht zuverlässig als Angabe.

                                  Wie schon mehrfach geschrieben wurde, nein. Die Angabe im HTML-Dokument ist erstens nicht zuverlässig, weil der Server eine andere, abweichende Angabe machen kann und zweitens – und noch viel wichtiger –, weil das Dokument von gänzlich anderer Kodierung sein kann. Die Angabe im HTML-Quelltext ist, wie schon mehrfach geschrieben wurde, ein Etikett, mehr nicht.

                                  Konkret ist die Angabe im Quelltext der Seite des SR aber zutreffend. Dort steht UTF-8 und es ist tatsächlich UTF-8.

                                  ich hatte doch ursprünglich eine Ausgabe mit utf8-decode drin, die sorgt doch auch dafür, dass alle Umlaute korrekt dargestellt werden, nur halt die vermaledeiten Anführungsstriche nicht.

                                  Vergiss vorläufig die Anführungsstriche. Dass diese durch dein htmlspecialchars mehrfach maskiert werden, da sie es schon auf der Seite vom SR schon sind, wurde auch schon mehrfach angemerkt. Was jetzt erst einmal wichtiger ist, ist der korrekte Umgang deines Skripts mit den gelieferten Daten bei der Weiterverarbeitung und Ausgabe. Wenn das steht, ist der Umgang mit bereits maskierten Inhalten nur noch eine Dreingabe.

                                  Tschö, Auge

                                  --
                                  Es schimmerte ein Licht am Ende des Tunnels und es stammte von einem Flammenwerfer.
                                  Terry Pratchett, „Gevatter Tod“
                        2. Hallo,

                          allerdings hast du die Daten der SR-Nachrichten fälschlicherweise als Iso interpretiert und zu UTF-8 kodiert obwohl sie bereits UTF-8 waren, deswegen die Fehler mit den Umlauten in dem Textteil.

                          mfg
                          Woodfighter

                          Wodurch interpretiere ich die SR-Nachrichten als ISO?

                          Durch den fehlenden antiqierten <meta>-Tag

                          <meta http-equiv="content-type" content="text/html; charset=utf-8">
                          

                          für das Encoding interpretiert DOMSocument::loadHTML() die Seite als ISO-8859-1. Die Klasse ist wohl noch nicht vollständig überarbeitet. Darauf muss man aber erst einmal kommen, da $dom->encoding mit "utf-8" antwortet...

                          Grüße
                          TS

      2. Hallo,

        Also, ich habe das jetzt so - wie von Dir empfohlen - gemacht, dennoch bekomme ich Fragezeichen. Hier ist die Originalseite (Inzwischen geht es um eine andere Meldung, aber mit

        demselben Problem:). Vielleicht siehst Du da ja mehr als ich.

        Linkbeschreibung

        ich sehe dort überhaupt keine Auffälligkeiten. Bei mir wird alles mMn ordentlich angezeigt.

        Aber das kann von Browser, Proxies (Mitlesern), Fonts auf dem Client und so vielen anderen Dingen abhängen... Ich ahbe so viele Fonts auf meinem Client, dass selten einer fehlt. Mach doch bitte mal einen Screenshot von deinem Arbeitsplatz zum Vergleich und lade den hier ins Forum.

        Grüße
        TS

      3. Hallo glupto,

        slightly off-topic aber eventuell für dich relevant: Vorsicht, könnte gut sein dass die von dir verlinkte Seite unter das Leistungsschutzrecht fällt.

        LG,
        CK

        1. Hallo glupto,

          slightly off-topic aber eventuell für dich relevant: Vorsicht, könnte gut sein dass die von dir verlinkte Seite unter das Leistungsschutzrecht fällt.

          LG,
          CK

          --
          > CK kennt Wayne Danke für den Hinweis, aber ich hatte ja in einer meiner Antworten geschrieben, dass alles mit dem sr abgesprochen ist.

          Danke für den Hinweis, aber ich hatte ja in einer meiner Antworten geschrieben, dass alles mit dem sr abgesprochen ist.