pt004: String-Vergleich

Hallo, ich lese rss-feeds ein und gebe sie auf meiner Seite aus (siehe Testseite: http://nachrichtentisch.de/_nordtest.php). Manche feeds enthalten doppelte TItel, die ich ausschließen möchte, was mir aber nicht gelingt, obwohl ich es mit der Abfrage: ($title !== $alttitle) versuche. Hier der zugehörige Code aus meinem feedreader:

        $pxml = simplexml_load_string(wandleTags($string), "SimpleXMLElement", LIBXML_NOCDATA);  
  
        if ($pxml->channel->item) $lesen = $pxml->channel->item;  
        if ($pxml->entry)         $lesen = $pxml->entry;  
        if ($pxml->item)         $lesen = $pxml->item;  
  
  
if (strlen($lesen[0]->title) > 0 or strlen($lesen[1]->title) > 0) {  
  
    foreach ($lesen as $nachricht) {  
  
  
        if ($nachricht->title != false) {                  /*-- Auswählen, ob Link für RSS $nachricht->link oder Atom $nachricht->link->attributes() --------*/  
  
                if ($nachricht->link) {  
  
                    if ((string)$nachricht->link) {  
                        $link = $nachricht->link;  
                    }  
                    elseif ($nachricht->link->attributes()) {  
                        $attr = $nachricht->link->attributes();  
                        $link = $attr["href"];  
                    }  
                }  
  
                /*-- Titel mit Link ------------------------------------------------------------------------------*/  
$title = ($nachricht->title);  
  
                    if (($nachricht->title) && ($title!=="") && ($title !== NULL) && ($title !== $alttitle) ){  
  
                    if (($nachricht->summary) != false) {  
  
$trenn4 = ": (";  
$title = explode($trenn4, $title);  
$title = $title[0];  
  
?>  
  
  
                    <li class="tooltip" title="  
                    <?php echo htmlspecialchars(filtereHTML($nachricht->summary), ENT_QUOTES); ?>  
                    <a href='  
                    <?php echo htmlspecialchars ($link, ENT_QUOTES); ?>  
                    ' target='_blank'>...mehr</a>" >  
                    <?php  
                    echo "$title";  
                    echo htmlspecialchars (filtereHTML($title), ENT_QUOTES);  
                    echo "$alttitle";  
                    echo htmlspecialchars (filtereHTML($alttitle), ENT_QUOTES);?>  
                    </li>  
<?php  
  
   $alttitle=$title;  
                }  

Hat jemand eine Idee, woran es liegt, dass doppelte Titel nicht ausgeschlossen werden?

Gruß und Dank pt004

  1. Manche feeds enthalten doppelte TItel, die ich ausschließen möchte, was mir aber nicht gelingt, obwohl ich es mit der Abfrage: ($title !== $alttitle) versuche.

    if (($nachricht->title) && ($title!=="") && ($title !== NULL) && ($title !== $alttitle) ) {

    Ausgabe

    $alttitle=$title;
    }

    Hat jemand eine Idee, woran es liegt, dass doppelte Titel nicht ausgeschlossen werden?

    Du vergleichst immer nur den Titel des letzten Eintrags mit dem aktuellen. Wenn die doppelten Einträge nicht direkt hintereinander erscheinen, können zumindest diese nicht erkannt werden.

    Zumindest solltest du die Titel in eine Liste setzen (PHP: Array), um nicht nur mit dem dem letzten, sondern mit allen bereits ausgegebenen Titeln vergleichen zu können.
    PHP hat IIRC eine Funktion namens in_array(), die dafür benutzen kannst: Statt $title !== $alttitle benutze in_array($titelliste, $titel) (genaue Syntax bitte nachschlagen).

    1. Du vergleichst immer nur den Titel des letzten Eintrags mit dem aktuellen. Wenn die doppelten Einträge nicht direkt hintereinander erscheinen, können zumindest diese nicht erkannt werden.

      Zumindest solltest du die Titel in eine Liste setzen (PHP: Array), um nicht nur mit dem dem letzten, sondern mit allen bereits ausgegebenen Titeln vergleichen zu können.
      PHP hat IIRC eine Funktion namens in_array(), die dafür benutzen kannst: Statt $title !== $alttitle benutze in_array($titelliste, $titel) (genaue Syntax bitte nachschlagen).

      Ja, Danke, da hast Du natürlich recht, aber: in dem Fall der Ostseezeitung, stehen die Titel ja direkt hintereinander und dennoch werden die Doubletten beim Vergleich ja offenbar nicht erkannt. Und ich wüsste schon gern, warum nicht.

      1. Tach!

        Ja, Danke, da hast Du natürlich recht, aber: in dem Fall der Ostseezeitung, stehen die Titel ja direkt hintereinander und dennoch werden die Doubletten beim Vergleich ja offenbar nicht erkannt. Und ich wüsste schon gern, warum nicht.

        Dann untersuch doch mal die beiden Strings genau. Und zwar nicht die Zeichen sondern die Bytes, denn auch PHP vergleicht nur Bytes. Zur besseren Sichtbarmachung von Nicht-Buchstaben kannst du die Strings durch urlencode() schicken und dann ausgeben. (bin2hex() geht auch, ist aber unübersichtlicher.)

        dedlfix.

        1. Dann untersuch doch mal die beiden Strings genau. Und zwar nicht die Zeichen sondern die Bytes, denn auch PHP vergleicht nur Bytes. Zur besseren Sichtbarmachung von Nicht-Buchstaben kannst du die Strings durch urlencode() schicken und dann ausgeben. (bin2hex() geht auch, ist aber unübersichtlicher.)

          dedlfix.

          Danke für den Hinweis, habe ich gemacht, aber es sieht immer noch nach demselben Inhalt aus (siehe
          http://nachrichtentisch.de/_nordtest.php.

      2. Du vergleichst immer nur den Titel des letzten Eintrags mit dem aktuellen. Wenn die doppelten Einträge nicht direkt hintereinander erscheinen, können zumindest diese nicht erkannt werden.

        Ja, Danke, da hast Du natürlich recht, aber: in dem Fall der Ostseezeitung, stehen die Titel ja direkt hintereinander und dennoch werden die Doubletten beim Vergleich ja offenbar nicht erkannt.

        Da hatte ich nicht reingeguckt, aber beim Blick in den Quelltext fällt mir folgendes auf:

        <a href='
        <?php echo htmlspecialchars ($link, ENT_QUOTES); ?>
                            ' target='_blank'>...mehr</a>" >
        <?php
        echo "$title";
        echo htmlspecialchars (filtereHTML($title), ENT_QUOTES);
        echo "$alttitle";
        echo htmlspecialchars (filtereHTML($alttitle), ENT_QUOTES);?>
        </li>

        HTML-seitig wird daraus dieses:

        <a href='
        http://www.ostsee-zeitung.de/Region-Rostock/Rostock/0-4-Hansa-verliert-gegen-Kiel                    ' target='_blank'>...mehr</a>" >
        title<br>0%3A4%3A+Hansa+verliert+gegen+Kiel<br>alttitle<br>0%3A4%3A+Hansa+verliert+gegen+Kiel

        </li>

        IMHO müsste das abschließende </li> in der direkt auf die $alttitel-Ausgabe folgenden Zeile erscheinen; tatsächlich kommt da aber erstmal eine Leerzeile. Es erscheinen zudem drei <br>, die im PHP-Code nicht angegeben sind – bemerkenswerterweise drei, nicht vier. Die $titel-Ausgabe ist von zwei <br> umrahmt, die $alttitel-Ausgabe hat hingegen nur ein <br> vorneweg und die Leerzeile hintenran. Irgendwas passt da nicht zusammen, wo kommen die <br> her, wo die Leerzeile?

        Weiterhin halte ich es für unklug, erst im if den titel!=alttitel-Vergleich zu machen (mit dem Originaltitel), dann dieses …

        $trenn4 = ": (";
        $title = explode($trenn4, $title);
        $title = $title[0];

        … und am Ende alttitel mit dem "explodierten" Titel zu füttern. Der nächste Vergleich mit dem Originaltitel geht nicht mehr gegen den alten Originaltitel, sondern den möglicherweise explodierten.

  2. Hakuna matata!

    Hallo, ich lese rss-feeds ein und gebe sie auf meiner Seite aus (siehe Testseite: http://nachrichtentisch.de/_nordtest.php). Manche feeds enthalten doppelte TItel, die ich ausschließen möchte, was mir aber nicht gelingt, obwohl ich es mit der Abfrage: ($title !== $alttitle) versuche. Hier der zugehörige Code aus meinem feedreader:

    if ($nachricht->title != false) {
       // ...
       $title = ($nachricht->title);
       if (($nachricht->title) && ($title!=="") && ($title !== NULL) && ($title !== $alttitle) ){

      
    Du hast echt Sorge darum, dass title falsy sein könnte, oder?  
      
    
    > Hat jemand eine Idee, woran es liegt, dass doppelte Titel nicht ausgeschlossen werden?  
      
    Du solltest dir mal die unveränderten Strings anschauen, also bevor du sie durch so Funktionen wie htmlspecialchars() und filtereHTML() jagst, das könnte aufschlussreich sein.  
      
    Es wäre außerdem viel angenehmer deinen Code zu lesen, wenn du sauber einrücken würdest und nicht einfach schließende Klammern weglässt.  
    
    -- 
    “All right, then, I'll go to hell.” – Huck Finn
    
    1. Du solltest dir mal die unveränderten Strings anschauen, also bevor du sie durch so Funktionen wie htmlspecialchars() und filtereHTML() jagst, das könnte aufschlussreich sein.

      Die Abfrage, ob $title !=  $alttitle ist, kommt ja, bevor ich die Strings durch die Funktionen jage, z. B.:

        
      $title = ($nachricht->title);  
        
            if (($nachricht->title) && ($title!=="") && ($title !== NULL) && ($title != $alttitle) ){  
        
                          if (($nachricht->summary) != false) {  
        
      .....  
        
      ?>  
        
        
                          <li class="tooltip" title="  
                          <?php echo htmlspecialchars(filtereHTML($nachricht->summary), ENT_QUOTES); ?>  
                          <a href='  
                          <?php echo htmlspecialchars ($link, ENT_QUOTES); ?>  
                          ' target='_blank'>...mehr</a>" >  
                          <?php  
                          echo "$title";  
                          echo htmlspecialchars (filtereHTML($title), ENT_QUOTES);  
                          echo "$alttitle";  
                          echo htmlspecialchars (filtereHTML($alttitle), ENT_QUOTES);?>  
                          </li>  
      <?php
      
      1. Hakuna matata!

        Die Abfrage, ob $title !=  $alttitle ist, kommt ja, bevor ich die Strings durch die Funktionen jage, z. B.:

        Und genau das könnte das Problem sein. Du vergleichst an der einen Stelle und lässt dir an einer anderen Stelle veränderte Daten zur Kontrolle ausgeben.

        --
        “All right, then, I'll go to hell.” – Huck Finn
      2. Hallo,

        <li class="tooltip" title="
        <?php echo htmlspecialchars(filtereHTML($nachricht->summary), ENT_QUOTES); ?>
        <a href='
        <?php echo htmlspecialchars ($link, ENT_QUOTES); ?>
        ' target='_blank'>...mehr</a>" >

        das hat jetzt nicht mit dem Stringvergleichs-Thema zu tun, aber der oben zitierte Abschnitt ist schon eigenartig. Willst du wirklich HTML-Code als Wert des title-Attributs ausgeben? Das wäre zumindest sehr eigenartig. Ich vermute, dass diesem "Konzept" ein gravierender Denkfehler zugrundeliegt.

        echo "$title";
        echo "$alttitle";

        Und das ist schlicht Unfug: Eine Stringvariable nochmal als alleinigen Inhalt in einen String einbetten? Wozu? Auch wenn das sehr oft gemacht wird, ergibt es nicht mehr Sinn.

        Ciao,
         Martin

        --
        Zivilisation bedeutet, dass die Eskimos warme Wohnungen bekommen und dann arbeiten müssen, damit sie sich einen Kühlschrank leisten können.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. das hat jetzt nicht mit dem Stringvergleichs-Thema zu tun, aber der oben zitierte Abschnitt ist schon eigenartig. Willst du wirklich HTML-Code als Wert des title-Attributs ausgeben? Das wäre zumindest sehr eigenartig. Ich vermute, dass diesem "Konzept" ein gravierender Denkfehler zugrundeliegt.

          Nein, als title-Attribut wird der Inhalt von "Summary" ausgegeben, also der Kurztext, den der feed mitliefert, funktioniert auch.

          echo "$title";
          echo "$alttitle";

          Und das ist schlicht Unfug: Eine Stringvariable nochmal als alleinigen Inhalt in einen String einbetten? Wozu? Auch wenn das sehr oft gemacht wird, ergibt es nicht mehr Sinn.

          Nein, hier wird nur der Zusatz-TEXT "$title" bzw. "$alttitle" ausgegeben, für Testzwecke, damit ich sehe, welchen Inhalt die Variablen haben.

          Gruß pt004

          1. Hi,

            echo "$title";
            echo "$alttitle";

            Und das ist schlicht Unfug: Eine Stringvariable nochmal als alleinigen Inhalt in einen String einbetten? Wozu? Auch wenn das sehr oft gemacht wird, ergibt es nicht mehr Sinn.

            Nein, hier wird nur der Zusatz-TEXT "$title" bzw. "$alttitle" ausgegeben, für Testzwecke, damit ich sehe, welchen Inhalt die Variablen haben.

            Dann schreibe

            echo $title;  
            echo $alttitle;
            

            – und lass die blödsinnigen Anführungszeichen weg …

            MfG ChrisB

            --
            Autocomplete has spoiled me to a point where it happens every so often that I encounter a CAPTCHA, and I just type in the first character … and then wait for the rest of the code to be automatically suggested :/
            1. Dann schreibe

              echo $title;

              echo $alttitle;

              
              > – und lass die blödsinnigen Anführungszeichen weg …  
              >   
              
              Missverständnis. Ich will die WORTE $title und $alttitle ausgeben, nicht den Inhalte der variablen, denn die kommen nächste Zeile.  
              
              
              1. Hi,

                Dann schreibe

                echo $title;

                echo $alttitle;

                
                > > – und lass die blödsinnigen Anführungszeichen weg …  
                > >   
                > Missverständnis. Ich will die WORTE $title und $alttitle ausgeben  
                  
                Dann musst du das Dollarzeichen maskieren oder einfache Hochkommata verwenden, denn sonst ersetzt PHP die Variablennamen durch den aktuellen Wert der Variablen.  
                  
                MfG ChrisB  
                  
                
                -- 
                Autocomplete has spoiled me to a point where it happens every so often that I encounter a CAPTCHA, and I just type in the first character … and then wait for the rest of the code to be automatically suggested :/
                
  3. Hi,

    Hallo, ich lese rss-feeds ein und gebe sie auf meiner Seite aus (siehe Testseite: http://nachrichtentisch.de/_nordtest.php). Manche feeds enthalten doppelte TItel, die ich ausschließen möchte, was mir aber nicht gelingt

    Der erste Feed, den du auf deiner Seite ausgibst, scheint http://www.ostsee-zeitung.de/rss/feed/oz_regionrostock zu sein, und der enthält momentan genau drei Einträge („Empor verliert mit 25:23“, „Nach 0:4-Niederlage: Hansa-Fans aufgebracht“ und „Unfall auf Ortsumgehung B 105“), keinen davon doppelt – auf deiner Seite sehe ich diese Einträge aber aktuell mehrfach.

    Die Vermutung liegt also nahe, dass es gar keine doppelten Einträge „auszufiltern“ gibt – sondern dass du sie vielmehr mit deinem Script *erzeugst*.

    MfG ChrisB

    --
    Autocomplete has spoiled me to a point where it happens every so often that I encounter a CAPTCHA, and I just type in the first character … and then wait for the rest of the code to be automatically suggested :/