Wieder mal char-Probleme

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • #16
    Nachfrage betr. strpos

    Danke für die vielen Antworten, Ich versuche jetzt noch mit strpos bestimmte Ergebnisse auszuschließen und scheitere in den Fällen mit Umlauten. Vermute, dass das was mit meinem UTF-8-Problem zu tun hat.
    Also es werde zum Beispiel $titles mit dem Begriff "Herzenswünsche" nicht
    ausgeschlossen, wie ich es will, "Abgeordnete" dagegen, wie gewünscht, schon.
    (Mal abgesehen davon, dass ich Arrays mit den Suchbegriffen bilden sollte).
    Code:

    PHP-Code:
    <?php

    /*error_reporting( -1 );
    ini_set('display_errors', TRUE);
    */
    define('CHARSET''UTF-8');
    $data file_get_contents('http://www.mz-web.de/mitteldeutschland/20641266,20641266.html');

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

    $xPath = new DOMXPath($doc);

    $zaehler 0;
    $epap "E-Paper";

    $abge "Abgeordnete befragen";
    $glueck "Gl&uuml;ckw&uuml;nsche";
    $trau "Traueranzeigen";
    $herz "Herzensw&uuml;nsche";


    foreach (
    $xPath->query('//h2/a') as $element


    {    
       

    $pos strpos($element->nodeValue$epap); 
    $pos1 strpos($element->nodeValue$abge); 
    $pos2 strpos($element->nodeValue$glueck); 
    $pos3 strpos($element->nodeValue$trau); 
    $pos4 strpos($element->nodeValue$herz); 


         
    $href $element->getAttribute('href');
         
    $hreft "http://www.mz-web.de" $href;
         
    $search "„";
         
    /* $title = $element->getAttribute('title'); */   
         
    $title $element->nodeValue;
            

    If ((
    $zaehler <= 13) && ($pos === false) && ($pos1 === false) && ($pos2 === false) && ($pos3 === false) && ($pos4 === false))
        {

    echo 
    "<li><a href=\"".htmlspecialchars($hreftENT_QUOTES'UTF-8'false)."\" target=\"_blank\">".htmlspecialchars($titleENT_QUOTES'UTF-8'false)."</a></li>\n"


                     
    $zaehler++;
               }
        }  


    ?>

    Kommentar


    • #17
      strpos() kann kein UTF-8. Dafür gibts: PHP: mb_strpos - Manual

      Außerdem haben die HTML-Entities in deinen Suchparametern nichts verloren. Es muss heißen "Glückwünsche" und nicht "Gl&uuml;ckw&uuml;nsche". Die PHP-Datei musst du natürlich auch mit UTF-8 Kodierung abspeichern.

      Durchnummerierte Variablen sind übrigens Quatsch. Verwende stattdessen Arrays und Schleifen.
      Zuletzt geändert von h3ll; 20.04.2013, 21:42.

      Kommentar


      • #18
        Aber dann

        .. müsste es doch so funktionieren (tut es aber nicht - was habe ich übersehen?) - die PHP-Datei ist in UTF-8:


        PHP-Code:
        /*error_reporting( -1 );
        ini_set('display_errors', TRUE);
        */
        define('CHARSET', 'UTF-8');
        $data = file_get_contents('http://www.mz-web.de/mitteldeutschland/20641266,20641266.html');

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

        $xPath = new DOMXPath($doc);

        $zaehler = 0;
        $epap = "E-Paper";

        $abge = "Abgeordnete befragen";
        $glueck = "Glückwünsche";
        $trau = "Traueranzeigen";
        $herz = "Herzenswünsche";


        foreach ($xPath->query('//h2/a') as $element) 


        {    
           

        $pos =  mb_strpos($element->nodeValue, $epap); 
        $pos1 = mb_strpos($element->nodeValue, $abge); 
        $pos2 = mb_strpos($element->nodeValue, $glueck); 
        $pos3 = mb_strpos($element->nodeValue, $trau); 
        $pos4 = mb_strpos($element->nodeValue, $herz); 


             $href = $element->getAttribute('href');
             $hreft = "http://www.mz-web.de" . $href;
             $search = "„";
             /* $title = $element->getAttribute('title'); */   
             $title = $element->nodeValue;
                

        If (($zaehler <= 13) && ($pos === false) && ($pos1 === false) && ($pos2 === false) && ($pos3 === false) && ($pos4 === false))
            {

        echo "<li><a href=\"".htmlspecialchars($hreft, ENT_QUOTES, 'UTF-8', false)."\" target=\"_blank\">".htmlspecialchars($title, ENT_QUOTES, false)."</a></li>\n"; 


                         $zaehler++;
                   }
            }  


        ?>


        </ul> 

          </div>

        Kommentar


        • #19
          mb_strpos() erwartet als vierten Parameter die Zeichenkodierung. Außerdem solltest du deinen Code lesbar formatieren. Im Moment ist die Code-Einrückung wie Kraut und Rüben. Aber davon abgesehen funktioniert der gepostete Code bei mir. Verstehe also nicht, was dein Problem ist.
          Zuletzt geändert von h3ll; 20.04.2013, 21:58.

          Kommentar


          • #20
            ???

            Also, ich habe es jetzt so gemacht, was mein Problem ist, sprich, was ich falsch mache, sehe ich leider immer noch nicht - inzwischen schließt er nicht einmal mehr die Begriffe aus, die keine Umlaute haben (Ja, sicher, aufräumen sollte ich auch):

            PHP-Code:
            <?php

            /*error_reporting( -1 );
            ini_set('display_errors', TRUE);
            */
            define('CHARSET''UTF-8');
            $data file_get_contents('http://www.mz-web.de/mitteldeutschland/20641266,20641266.html');

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

            $xPath = new DOMXPath($doc);

            $zaehler 0;


            $epap "E-Paper";
            $abge "Abgeordnete befragen";
            $glueck "Glückwünsche";
            $trau "Traueranzeigen";
            $herz "Herzenswünsche";


            foreach (
            $xPath->query('//h2/a') as $element


            {    
               

                        
            $pos =  mb_strpos($element->nodeValue$epap"utf-8"); 
                        
            $pos1 mb_strpos($element->nodeValue$abge"utf-8" ); 
                        
            $pos2 mb_strpos($element->nodeValue$glueck"utf-8"); 
                        
            $pos3 mb_strpos($element->nodeValue$trau"utf-8"); 
                        
            $pos4 mb_strpos($element->nodeValue$herz"utf-8"); 


                 
            $href $element->getAttribute('href');
                 
            $hreft "http://www.mz-web.de" $href;
                 
            $search "„";
                 
            /* $title = $element->getAttribute('title'); */   
                 
            $title $element->nodeValue;
                    

            If ((
            $zaehler <= 13) && ($pos === false) && ($pos1 === false) && ($pos2 === false) && ($pos3 === false) && ($pos4 === false))
                {

            echo 
            "<li><a href=\"".htmlspecialchars($hreftENT_QUOTES'UTF-8'false)."\" target=\"_blank\">".htmlspecialchars($titleENT_QUOTESfalse)."</a></li>\n"


                             
            $zaehler++;
                       }
                }  


            ?>


            </ul> 

              </div>
            Ausgabe:

            Code:
                15-Jähriger fuhr betrunken Auto
                Ostern ist Frühling - Frei nach Goethe!
                Neonazi-Konzert in Groß Naundorf geplant
                Haseloff entlässt Ministerin Wolff per Anruf
                E-Paper
                Rehe fressen Gräber leer
                Mehrheit der Leser ist gegen eine Schließung
                Die Saline wird abgerissen
                Hundert Briefträger streiken
                Es geht um 7,1 Millionen Euro
                Gewerbegebiet Ost im Dunkeln
                Abgeordnete befragen
                Glückwünsche
                Traueranzeigen
            E-Paper und die letzten drei sollten aber nicht erscheinen.

            Kommentar


            • #21
              Also wenn ich den Code bei mir ausführe, erscheint:

              15-Jähriger fuhr betrunken Auto
              Ostern ist Frühling - Frei nach Goethe!
              Neonazi-Konzert in Groß Naundorf geplant
              Haseloff entlässt Ministerin Wolff per Anruf
              Rehe fressen Gräber leer
              Mehrheit der Leser ist gegen eine Schließung
              Die Saline wird abgerissen
              Hundert Briefträger streiken
              Es geht um 7,1 Millionen Euro
              Gewerbegebiet Ost im Dunkeln
              Ausbildungsplätze
              Reisemarkt
              Meine Vermutung ist, dass du die PHP-Datei doch nicht mit UTF-8 Kodierung abgespeichert hast.

              Kommentar


              • #22
                Oha

                Dann habe ich da wohl eine größere Wissenslücke, als ich dachte. Welche php-Datei meinst Du? Die Webseite selbst? Der Header meiner Seite enthält:

                PHP-Code:
                <?php

                header
                ('Content-Type: text/html; charset=UTF-8');
                ?>
                Ich dachte damit sei alles geregelt.

                (Also ich speicher direkt im Editor meines Filemanagers bei One.com ab, dort habe ich keine Einstellmöglichkeiten. Habe jetzt aber mal den Text in Notepad++ als Utf-8 ohne BOM abgespeichert, und dann wieder reinkopiert in meine php-Datei bei meinem Provider und das hat nix geändert.)
                Zuletzt geändert von newbie1955; 20.04.2013, 22:39.

                Kommentar


                • #23
                  Zitat von newbie1955 Beitrag anzeigen
                  (Also ich speicher direkt im Editor meines Filemanagers bei One.com ab, dort habe ich keine Einstellmöglichkeiten. Habe jetzt aber mal den Text in Notepad++ als Utf-8 ohne BOM abgespeichert, und dann wieder reinkopiert in meine php-Datei bei meinem Provider und das hat nix geändert.)
                  Dann läuft irgendwas schief. Mit Notepad++ die Datei als UTF-8 ohne BOM abspeichern ist schon mal goldrichtig. Dann bleibt wohl nur noch ein Fehler beim Kopieren. Wie kopierst du die Datei auf den Server? Per FTP? Probier mal einen anderen FTP-Client und stell den Transfermodus auf binär und nicht auf Text.

                  Kommentar


                  • #24
                    Leider

                    wird das wohl heute abend nix mehr. Habe mit FIlezilla übertragen (Binär) und dennoch kommt bei mir immer noch das falsche Ergebnis. Werde morgen noch mal rangehen.

                    Wie speicherst Du denn in utf-8 ab? (Ich müsste ja eigentlich Deine Schritte, die zum Erfolg führen, einfach nachgehen können). Muss ich denn jedesmal mit Notepad++ arbeiten und dann hochladen? Bisher war ich mit dem Editor meines Filemanagers bei One.com immer gut gefahren - ich arbeite eigentlich fast nur direkt auf dem Server?

                    Danke erstmal für die Mühe...

                    Kommentar


                    • #25
                      Zitat von newbie1955 Beitrag anzeigen
                      Wie speicherst Du denn in utf-8 ab? (Ich müsste ja eigentlich Deine Schritte, die zum Erfolg führen, einfach nachgehen können).
                      Wenn ich professionell entwickle, dann verwende ich Netbeans IDE. Für kleine Spielereien auf meinem Heimrechner tuts auch Notepad++.

                      Zitat von newbie1955 Beitrag anzeigen
                      Muss ich denn jedesmal mit Notepad++ arbeiten und dann hochladen?
                      Du kannst dir einen beliebigen Editor aussuchen, der UTF-8 ohne BOM abspeichern kann. Das kann so gut wie jeder moderne Texteditor. Wenn du ernsthaft programmierst, würde ich dir aber zu einer IDE raten, da sie neben Code-Highlighting auch noch eine Syntaxprüfung und Autocompletion bietet, was das Programmieren angenehm erleichtert.

                      Zitat von newbie1955 Beitrag anzeigen
                      Bisher war ich mit dem Editor meines Filemanagers bei One.com immer gut gefahren
                      Kenn ich nicht.

                      Zitat von newbie1955 Beitrag anzeigen
                      ich arbeite eigentlich fast nur direkt auf dem Server?
                      Wenns ein Entwicklungsserver ist, dann spricht nichts dagegen. Wenn das allerdings der Produktivserver sein soll, würde sich eher anbieten erst mal lokal zu entwickeln und dann das fertige Software-Paket auf den Produktivserver zu deployen.

                      Kommentar


                      • #26
                        Immer noch nicht

                        Hallo, könntest Du mir noch mal exakt die Schritte beschreiben, die Du gemacht hast, denn ich habe jetzt alles noch mal von vorne gemacht, mit UTF-8 ohne BOM abgespeichert, mit FIlezilla hochgeladen, dennoch kommen die bescheuterten "Glückwünsche" usw. weiter. Wäre Dir für jeden Tipp dankbar, denn ansonsten weiß ich mir keinen Rat mehr. Könnte ja nach "ckw" suchen, aber dann fällt auch manches andere raus. Außerdem hatte ich ja schließlich zumindest das "E-Paper" schon mal draußen, das hat ja auch keine Umlaute. Den anderen Editor werde ich mit besorgen.

                        Das encoding muss man doch auch hier in Anführungsstriche setzen, ocer?

                        Kommentar


                        • #27
                          Hatte das nur einmal verkürzt mit "E-Paper" getestet, mit stripos wird es bei mir gefunden, mit mb_strpos hingegen nicht. Alles andere ist jetzt mit UTF-8 eingerichtet und gespeichert. Unter mbstring steht bei mit in der phpinfo zwar bei Support enabled, doch da folgen noch mehr Angaben, möglich das da noch etwas in der ini geändert werden müsste.

                          PHP-Code:
                          <?php
                          ... ... ...

                          foreach (
                          $xPath->query("//h2/a") as $element) {

                              
                          $title $element->nodeValue;    
                              
                          $pos stripos($title$epap);
                              
                              if (
                          $pos === false) {echo "Nicht gefunden!<br>\n";}
                              
                              else {echo 
                          "gefunden an Position: ".$pos."<br>\n";
                              }


                          /*
                          Nicht gefunden!
                          Nicht gefunden!
                          Nicht gefunden!
                          Nicht gefunden!
                          gefunden an Position: 0
                          Nicht gefunden!
                          Nicht gefunden!
                          Nicht gefunden!
                          Nicht gefunden!
                          Nicht gefunden!
                          Nicht gefunden!
                          Nicht gefunden!
                          Nicht gefunden!
                          Nicht gefunden!
                          Nicht gefunden!
                          Nicht gefunden!
                          Nicht gefunden!
                          */

                          $epap "E-Paper";

                          foreach (
                          $xPath->query("//h2/a") as $element) {

                              
                          $title $element->nodeValue;    
                              
                          $pos =  mb_strpos($title$epap"utf-8");
                              
                              if (
                          $pos === false) {echo "Nicht gefunden!<br>\n";}
                              
                              else {echo 
                          "gefunden an Position: ".$pos."<br>\n";
                              }

                          /*
                          Nicht gefunden!
                          Nicht gefunden!
                          Nicht gefunden!
                          Nicht gefunden!
                          Nicht gefunden!
                          Nicht gefunden!
                          Nicht gefunden!
                          Nicht gefunden!
                          Nicht gefunden!
                          Nicht gefunden!
                          Nicht gefunden!
                          Nicht gefunden!
                          Nicht gefunden!
                          Nicht gefunden!
                          Nicht gefunden!
                          Nicht gefunden!
                          Nicht gefunden!

                          */
                          ?>

                          Kommentar


                          • #28
                            Strpos

                            Danke für Deine Mühe: Also mit strpos oder stripos findet er alles, was keine Umlaute hat und nur sofern ich KEIN Encoding angebe). Aber jetzt habe ich es auf vielleicht komplizierte Weise, aber immerhin überhaupt geschafft. Durch utf8_decode und _encode:

                            PHP-Code:
                            <?php

                            /*error_reporting( -1 );
                            ini_set('display_errors', TRUE);
                            */
                            define('CHARSET''UTF-8');
                            $data file_get_contents('http://www.mz-web.de/mitteldeutschland/20641266,20641266.html');

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

                            $xPath = new DOMXPath($doc);

                            $zaehler 0;


                            $epap "E-Paper";
                            $abge "Abgeordnete befragen";
                            $glueck "Glückwünsche";
                            $trau "Traueranzeigen";
                            $herz "Herzenswünsche";


                            foreach (
                            $xPath->query('//h2/a') as $element


                            {    
                               



                                 
                            $href $element->getAttribute('href');
                                 
                            $hreft "http://www.mz-web.de" $href;
                                 
                            $search "„";
                                 
                            /* $title = $element->getAttribute('title'); */   
                                 
                            $title $element->nodeValue;
                                 

                            $href utf8_decode($href);
                            $title utf8_decode($title);

                                        
                            $pos =  strpos($title$epap); 
                                        
                            $pos1 strpos($title$abge); 
                                        
                            $pos2 strpos($title$glueck); 
                                        
                            $pos3 strpos($title$trau); 
                                        
                            $pos4 strpos($title$herz); 


                            If ((
                            $zaehler <= 13) && ($pos === false) && ($pos1 === false) && ($pos2 === false) && ($pos3 === false) && ($pos4 === false))
                                {


                            $href utf8_encode($href);
                            $title utf8_encode($title);

                            echo 
                            "<li><a href=\"".htmlspecialchars($hreftENT_QUOTES'UTF-8'false)."\" target=\"_blank\">".htmlspecialchars($titleENT_QUOTESfalse)."</a></li>\n"


                                             
                            $zaehler++;
                                       }
                                }  


                            ?>


                            </ul> 

                              </div>
                            Zuletzt geändert von newbie1955; 21.04.2013, 17:26.

                            Kommentar


                            • #29
                              Zitat von newbie1955 Beitrag anzeigen
                              PHP-Code:

                                          $pos 
                              =  mb_strpos($element->nodeValue$epap"utf-8"); 
                                          
                              $pos1 mb_strpos($element->nodeValue$abge"utf-8" ); 
                                          
                              $pos2 mb_strpos($element->nodeValue$glueck"utf-8"); 
                                          
                              $pos3 mb_strpos($element->nodeValue$trau"utf-8"); 
                                          
                              $pos4 mb_strpos($element->nodeValue$herz"utf-8"); 
                              Du hast Offset vergessen und ich hatte das so von Deinem Beispiel kopiert. Die Reihenfolge muss immer eingehalten werden.

                              int mb_strpos ( string $haystack , string $needle [, int $offset = 0 [, string $encoding ]] )
                              Wenn PHP als ersten und zweiten Parameter-Wert einen String erwartet, an dritter Stelle einen Integer-Wert und an vierter Stelle wieder einen String, dann kann das nicht funktionieren, wenn Du einen Parameter weglässt und PHP an dritter Stelle statt eines Integer-Wertes einen String findet. Nun funktioniert es wie Du siehst auch mit den Umlauten.

                              PHP-Code:
                              $epap1 "E-Paper";
                              $epap2 "Glückwünsche";

                              foreach (
                              $xPath->query("//h2/a") as $element) {

                                  
                              $title $element->nodeValue;    
                                  
                              $pos1  =  mb_strpos($title$epap10"utf-8");
                                  
                              $pos2  =  mb_strpos($title$epap20"utf-8");    
                                  
                                  
                                  if (
                              $pos1 === false) {echo "Nicht gefunden!<br>\n";
                                  }
                                  else {echo 
                              "gefunden an Position: ".$pos1."<br>\n";
                                  }
                                  if (
                              $pos2 === false) {echo "Nicht gefunden!<br>\n";
                                  }
                                  else {echo 
                              "gefunden an Position: ".$pos2."<br>\n";
                                  }        

                              /*
                              Nicht gefunden!
                              Nicht gefunden!
                              Nicht gefunden!
                              Nicht gefunden!
                              Nicht gefunden!
                              Nicht gefunden!
                              Nicht gefunden!
                              Nicht gefunden!
                              gefunden an Position: 0
                              Nicht gefunden!
                              Nicht gefunden!
                              Nicht gefunden!
                              Nicht gefunden!
                              Nicht gefunden!
                              Nicht gefunden!
                              Nicht gefunden!
                              Nicht gefunden!
                              Nicht gefunden!
                              Nicht gefunden!
                              Nicht gefunden!
                              Nicht gefunden!
                              Nicht gefunden!
                              Nicht gefunden!
                              Nicht gefunden!
                              Nicht gefunden!
                              gefunden an Position: 0
                              Nicht gefunden!
                              Nicht gefunden!
                              Nicht gefunden!
                              Nicht gefunden!
                              Nicht gefunden!
                              Nicht gefunden!
                              Nicht gefunden!
                              Nicht gefunden!

                              */ 
                              Also, es scheint zu funktionieren, nur die Warnungen wegen den Entities sind noch vorhanden.

                              PHP-Code:
                              <?php header("Content-Type: text/html; charset=UTF-8"); ?>
                              <!DOCTYPE html>
                              <html>

                              <head>
                              <title>Test</title>
                              </head>

                              <body>
                              <div>
                              <ul>
                              <?php error_reporting(E_ERROR|E_PARSE);  // hochgesetzt wegen Entitie-Warnungen

                              $data file_get_contents('http://www.mz-web.de/mitteldeutschland/20641266,20641266.html');

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

                              $xPath   = new DOMXPath($doc);
                              $zaehler 0;

                              $epap   "E-Paper";
                              $abge   "Abgeordnete befragen";
                              $glueck "Glückwünsche";
                              $trau   "Traueranzeigen";
                              $herz   "Herzenswünsche";

                              foreach (
                              $xPath->query("//h2/a") as $element) {

                                  
                              $title $element->nodeValue;

                                  
                              $pos =  mb_strpos($title$epap,   0"utf-8");
                                  
                              $pos1 mb_strpos($title$abge,   0"utf-8");
                                  
                              $pos2 mb_strpos($title$glueck0"utf-8");
                                  
                              $pos3 mb_strpos($title$trau,   0"utf-8");
                                  
                              $pos4 mb_strpos($title$herz,   0"utf-8");

                                  
                              $href $element->getAttribute('href');
                                  
                              $hreft "http://www.mz-web.de" $href;
                                  
                              $search "„";


                                  if ((
                              $zaehler <= 13) && ($pos === false) && ($pos1 === false) && ($pos2 === false) && ($pos3 === false) && ($pos4 === false)) {

                                      echo 
                              "<li><a href=\"".htmlspecialchars($hreftENT_QUOTES"UTF-8"false)."\" target=\"_blank\">".htmlspecialchars($titleENT_QUOTESfalse)."</a></li>\n";

                                      
                              $zaehler++;
                                  }
                              }
                              /* Ausgabe:

                                  DGB setzt weiter auf Dialog
                                  Abenteurer suchen Gold in Thüringen
                                  Sechs Schwerverletzte bei Unfall auf A4
                                  Freie Wähler mit Frau als Spitzenkandidatin
                                  Kind mit schweren Verbrennungen in Spezialklinik ausgeflogen
                                  71-Jähriger nach Autounfall schwer verletzt
                                  Land kauft jährlich Kunst für 250.000 Euro
                                  15-Jähriger fuhr betrunken Auto
                                  Ostern ist Frühling - Frei nach Goethe!
                                  Neonazi-Konzert in Groß Naundorf geplant
                                  Ausbildungsplätze
                                  Reisemarkt
                              */
                              ?>
                              </ul>
                              </div>
                              </body>
                              </html>
                              Zuletzt geändert von Melewo; 21.04.2013, 18:54.

                              Kommentar


                              • #30
                                Danke

                                naja, Depp und Depp gesellt sich gern .

                                Danke für die Hilfe, aber bei mir kommen die Umlaut-Begriffe trotzdem.

                                newbie1955
                                Zuletzt geändert von newbie1955; 21.04.2013, 19:40.

                                Kommentar

                                Lädt...
                                X