Sven Rautenberg: Ich will &nbsp ersetzen

Beitrag lesen

Moin!

Ok, ich sehe ein RSS-Fragment.

In diesem Fragment sind keine   notiert.

Hier der QUelltext:

<item>

<link>http://sz.de/1.1697295</link>
      <title><![CDATA[Protest in Istanbul: Türkische Polizei räumt Gezi-Park]]></title>
      <description><![CDATA[
                                                <div>
                                                    <img src="http://polpix.sueddeutsche.com/polopoly_fs/1.1697383.1371322453!/httpImage/image.jpg_gen/derivatives/135x135/image.jpg" alt="-, OZAN KOSE / AFP" title="-, OZAN KOSE / AFP" width="135" height="135" style="float: left;margin-right: 10px;" border="0" />
                                                    <p style="padding: 0px;">
                                                    Tränengas und Wasserwerfer: Die türkische Polizei hat den Gezi-Park in Istanbul gestürmt und vollständig geräumt. Kurz nachdem Ministerpräsident Erdogan den Demonstranten ein Ultimatum gesetzt hatte, begann die Polizei einen Großeinsatz.
                                                  </p>
                                               </div>]]></description>

  
Wenn ich davon ausgehe, dass die "normalen" XML-Regeln für CDATA auch hier korrekt greifen, erhältst du beim PHP-seitigen Zugriff auf die Description also einen String, der genau den Zeichen-Inhalt hat, der innerhalb der CDATA-Klammern steht. Also sind da keine &nbsp; drin.  
  

> ~~~php
  

> if (($nachricht->title) && ($title!="") && ($title != NULL)) { // fehlerhafter Check!  
>   
>     if (($nachricht->description) != false) { // fragwürdiger Check  
>   
>         $desc = ($nachricht->description); // Der String von oben steht jetzt in $desc  
>         $desc = trim($desc); // Führend und folgendes Whitespace (Leerzeichen u.a.) werden entfernt  
>         str_replace("&nbsp", "", $desc); // Es sind immer noch keine &nbsp; im String.  
>         preg_replace("/(\s)|(\&nbsp\;)/",'',$desc); // auch hier nicht.  
>   
>         // Jetzt kommt die Ausgabe. Was passiert mit $desc?  
>   
>         echo "<li><a href=\""  
>              . htmlspecialchars(filtereLinks($link), ENT_QUOTES)  
>              . "\" target=\"_blank\"title =\""  
>              . htmlspecialchars(filtereHTML($desc), ENT_QUOTES)  
>              . "\">"  
>              . htmlspecialchars(filtereHTML($nachricht->title), ENT_QUOTES)  
>              . "</a></li>\n";  
>    }  
> }  
> 

Man sieht: echo htmlspecialchars(filtereHTML($desc), ENT_QUOTES);

Die Beschreibung geht also zuerst noch in eine uns unbekannte Funktion "filtereHTML", und danach werden Entities aus Sonderzeichen gemacht.

Wenn vorher keine &nbsp; im String waren, aber hinterher, dann ist diese Funktion "filtereHTML" Schuld.

Ach ja:

if (($nachricht->title) && ($title!="") && ($title != NULL)) { // fehlerhafter Check!

In "$nachricht->title" steht der Titel, aber $title ist eine ganz andere, vermutlich nicht initialisierte Variable, die mit der ersten nichts zu tun hat.

if (($nachricht->description) != false) { // fragwürdiger Check

Wenn man wissen will, ob irgendeine Variable "irgendwas gutes" enthält, wäre if ($nachricht->description) vollkommen ausreichend, so wie auch bei $nachricht->title.

Mir persönlich gefällt das allerdings nicht. Wenn ich "keine Description" habe, sieht das in der Datenstruktur auch irgendwie aus, und ich würde das möglichst explizit prüfen, damit ich es unterscheiden kann von "kaputte Description".

- Sven Rautenberg