glupto: Ich will &nbsp ersetzen

Hallo, ich parse einen feed und gebe die description aus, werde aber diverse "&nbsp" die am Ende herumstehen, nicht los. Auch nach reichlichem gegoogle (z. B. bei stackoverflow wurde das schon mal debattiert) und verschiedenen Lösungsversuchen z. B. mit str-replace, ich kriege die &nbsp nicht durch einfachen Leerraum oder "gar nichts" ersetzt. Hat jemand eine Idee?

  1. Liebe(r) glupto,

    was genau hast Du versucht (code), zu welchem Ergebnis hat das geführt, und was hat Dir daran nicht eingeleuchtet?

    Tipps für Fragende

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. Liebe(r) glupto,

      was genau hast Du versucht (code), zu welchem Ergebnis hat das geführt, und was hat Dir daran nicht eingeleuchtet?

      Tipps für Fragende

      Liebe Grüße,

      Felix Riesterer.

      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>
      

      Die description hole ich mit PHP so ab und gebe sie mit HTML so aus:

                          if (($nachricht->title) && ($title!="") && ($title != NULL)){  
        
        
                          if (($nachricht->description) != false) {  
        
      $desc = ($nachricht->description);  
      $desc = trim($desc);  
      str_replace("&nbsp", "", $desc);  
      preg_replace("/(\s)|(\&nbsp\;)/",'',$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";  
                      }  
      
      

      Ausgegeben wird die description und am Ende sieht der Text so aus:
      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. &nbsp&nbsp&nbsp

      Ich hatte es auch mit preg_replace("/(\s)|(\&nbsp\;)/",'',$desc);
      versucht. Das Ergebnis. Die &nbsp bleiben, wo sie sind. Habe es auch noch mit anderen Sachen versucht, das müsste ich aber in meiner Erinnerung graben, herauskam bestenfalls, dass aus &nbsp unlesbare Zeichen wurden.

      Gruß
      glupto

      1. Hi,

        str_replace("&nbsp", "", $desc);
        preg_replace("/(\s)|(&nbsp;)/",'',$desc);

        Es wäre hilfreich, das Ergebnis der Ersetzung nicht einfach wieder wegzuschmeißen ...

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        O o ostern ...
        Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
        1. Hi,

          str_replace("&nbsp", "", $desc);
          preg_replace("/(\s)|(&nbsp;)/",'',$desc);

          Es wäre hilfreich, das Ergebnis der Ersetzung nicht einfach wieder wegzuschmeißen ...

          cu,
          Andreas

          Entschuldigt, aber das sind zwei vergebliche Versuche, die im Code versehentlich stehen geblieben sind (weil sie ja eh wirkungslos waren). Ich habe beides natürlich getrennt versucht - ohne Erfolg.

          1. Hallo

            Hi,

            str_replace("&nbsp", "", $desc);
            preg_replace("/(\s)|(&nbsp;)/",'',$desc);

            Es wäre hilfreich, das Ergebnis der Ersetzung nicht einfach wieder wegzuschmeißen ...

            cu,
            Andreas

            Entschuldigt, aber das sind zwei vergebliche Versuche, die im Code versehentlich stehen geblieben sind (weil sie ja eh wirkungslos waren). Ich habe beides natürlich getrennt versucht - ohne Erfolg.

            Es geht MudGuard nicht darum, dass die zwei Versuche getrennt zu erfolgen haben, sondern darum, dass du das Ergebnis der Funktion(en) nicht an eine Variable zurückgibst. Zudem würdest du bei deinem Code, wenn er denn funktionierte, (unter anderem) einen Haufen Semikola zurückbekommen, da du diese – aus "&nbsp;" stammenden – nicht mit ersetzt.

            Schau dir die Beispiele zu str_replace und preg_replace in der Doku an. Für deinen Zweck sollte str_replace schneller ausgeführt werden und daher besser geeignet sein.

            Tschö, Auge

            --
            Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
            Terry Pratchett, "Wachen! Wachen!"
            ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
            Veranstaltungsdatenbank Vdb 0.3
            1. Es geht MudGuard nicht darum, dass die zwei Versuche getrennt zu erfolgen haben, sondern darum, dass du das Ergebnis der Funktion(en) nicht an eine Variable zurückgibst. Zudem würdest du bei deinem Code, wenn er denn funktionierte, (unter anderem) einen Haufen Semikola zurückbekommen, da du diese – aus "&nbsp;" stammenden – nicht mit ersetzt.

              Schau dir die Beispiele zu str_replace und preg_replace in der Doku an. Für deinen Zweck sollte str_replace schneller ausgeführt werden und daher besser geeignet sein.

              Tschö, Auge

              Tja, wer gucken kann, ist klar im Vorteil, aber darum heißt Du ja auch "Auge". Irgendwie hatte ich im Hinterkopf falsch gespeichert, dass die Korrektur gleich im eingelesenen String "zurückgeschrieben" wird. Weiß nicht, wie ich darauf komme. Danke!

              1. eingelesenen String "zurückgeschrieben" wird. Weiß nicht, wie ich darauf komme.

                Vorher in Perl programmiert?

      2. Moin!

        Ok, ich sehe ein RSS-Fragment.

        In diesem Fragment sind keine &nbsp; 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

  2. હેલો

    Hallo, ich parse einen feed und gebe die description aus, werde aber diverse "&nbsp"

    Richtig schreibt man es „&nbsp;“, und ja, die kriegt man ganz einfach durch einfache Ersetzung weg.

      $_text = '&nbsp; &nbsp;Lorem &nbsp;ipsum &nbsp;&nbsp;Kauderwelsch&nbsp;';  
      print str_replace('&nbsp;', ' ', $_text);
    

    બાય

    --
     .
    ..: