1. Dashboard
  2. Artikel
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  1. HTML - Webmaster Forum
  2. Programmierung - Entwickler Forum
  3. PHP Forum - Apache - CGI - Perl - JavaScript und Co.

Smilies-Funktion

  • vbtricks
  • 23. September 2006 um 11:30
  • vbtricks
    Kaiserliche Hoheit
    Beiträge
    1.586
    • 23. September 2006 um 11:30
    • #1

    Salut,

    ich versuche gerade, Smilies auf meiner Seite zu integrieren, dafür habe ich folgende Funktion geschrieben:

    Code
    function dosmilies($text) {
       $smiliessemicolon = array(";)" => "smilie03.gif",
        ";-)" => "smilie03.gif");
    
       // lower case for keys!
       $smiliesdot = array(":)" => "smilie0 1.gif",
        ":-)" => "smilie0 1.gif",
        ">:)" => "smilie04.gif",
        ">:-)" => "smilie04.gif",
        ":devil:" => "smilie04.gif",
        ":p" => "smilie06.gif",
        ":-p" => "smilie06.gif",
        ":d" => "smilie02.gif",
        ":-d" => "smilie02.gif",
        ":-(" => "smilie05.gif",
        ":(" => "smilie05.gif",
        ":o)" => "smilie07.gif",
        ":o" => "smilie07.gif"
       );
    
       $pos = strpos($text, ":", 0);
       while($pos != false) {
         //$pos2 = strrpos($text, "<pre>", $pos);
         //if(($pos2 == false) || (strrpos($text, "</pre>") > $pos2))
         //{
           reset($smiliesdot);
           while (list ($key, $val) = each ($smiliesdot))
           {
             if(strtolower(substr($text, $pos, strlen($key))) == $key) {
               $temp = "<img src=\"img/smilies/".$val."\" border=\"0\" alt=\"$key\" />";
               $text = substr($text, 0, $pos).$temp.substr($text, $pos + strlen($key));
               $pos += strlen($temp);
               break;
             }
           }
         //}
         $pos = strpos($text, ":", $pos + 1);
       }
       return $text;
    }
    Alles anzeigen


    Diese ersetzt aber natürlich im gesamten Text die entsprechenden Kürzel durch die Bilder. Zwischen den Anfangs- und End-Tags von <pre> und <input> möchte ich das aber verhindern.

    Also wollte ich die auskommentierten Zeilen einfügen. Bei der ersten erhalte ich aber den Fehler, dass zu viele Parameter angegeben seien. Scheinbar unterstützt meine PHP-Version (4.4) noch nicht den offset-Parameter.

    Daher meine Frage: Wie kann ich anders rückwärts suchen (bleibt mir nur die manuelle Version mit einer Schleife) oder gibt es gar eine weitaus effizientere Möglichkeit, die Smilies zu ersetzen?


    Danke im Voraus,

    Stefan

    Farben richtig wählen: ColorBlender
    Website validieren: W3C Markup Validation Service
    Meine Website: vbtricks
    Kleines Snake zwischendurch?

  • BendOr
    Kaiser(in)
    Beiträge
    2.496
    • 23. September 2006 um 12:33
    • #2

    du musst den text am besten unterteilen
    zB mit
    $erg = split('\</?pre\>', $text);
    dann kannste noch mit einer foreach schleife smilies ersetzen/nicht ersetzen lassen

    Sei immer du selbst. Außer du kannst Batman sein. Sei immer Batman!

  • Modula
    Kaiserliche Hoheit
    Beiträge
    1.515
    • 23. September 2006 um 12:36
    • #3

    ...änder auch noch while($pos != false) in while($pos !== false)

    Zoggerforum.de Betreuer * Mod @ ibforen.de * Admin @ daoc-ds.de
    ICQ Nummer kann via PN erfragt werden

  • vbtricks
    Kaiserliche Hoheit
    Beiträge
    1.586
    • 30. September 2006 um 10:43
    • #4

    Salut,

    Modula
    erst habe ich mich ja gefragt, wieso, aber inzwischen ist es mir klar. Sonst wird die Schleife nämlich nie ausgeführt.

    BendOr:
    Wenn es sich nur um einen Tag handeln würde, wäre das eine praktikable Lösung. Leider habe ich noch mehr Tags, das war aus meinem Post aber auch nicht ersichtlich.

    Folgendes ist jetzt meine Lösung:

    Code
    function dosmiliestextpart($text, $smiliesdot, $smiliessemicolon) {
       $pos = strpos($text, ":", 0);
       while($pos != false) {
         reset($smiliesdot);
         while (list ($key, $val) = each ($smiliesdot))
         {
           if(strtolower(substr($text, $pos, strlen($key))) == $key) {
             $temp = "<img src=\"img/smilies/".$val."\" border=\"0\" alt=\"$key\" />";
             $text = substr($text, 0, $pos).$temp.substr($text, $pos + strlen($key));
             $pos += strlen($temp);
             break;
           }
         }
         $pos = strpos($text, ":", $pos + 1);
       }
    
       $pos = strpos($text, ";", 0);
       while($pos != false) {
         reset($smiliessemicolon);
         while (list ($key, $val) = each ($smiliessemicolon))
         {
           if(substr($text, $pos, strlen($key)) == $key) {
             $temp = "<img src=\"img/smilies/".$val."\" border=\"0\" alt=\"$key\" />";
             $text = substr($text, 0, $pos).$temp.substr($text, $pos + strlen($key));
             $pos += strlen($temp);
             break;
           }
         }
         $pos = strpos($text, ";", $pos + 1);
       }
       return $text; 
     }
     
     function dosmilies($text) {
       $smiliessemicolon = array(";)" => "smilie03.gif",
        ";-)" => "smilie03.gif");
    
       // lower case for keys!
       $smiliesdot = array(":)" => "smilie 01.gif",
        ":-)" => "smilie 01.gif",
        ">:)" => "smilie04.gif",
        ">:-)" => "smilie04.gif",
        ":devil:" => "smilie04.gif",
        ":p" => "smilie06.gif",
        ":-p" => "smilie06.gif",
        ":d" => "smilie02.gif",
        ":-d" => "smilie02.gif",
        ":-(" => "smilie05.gif",
        ":(" => "smilie05.gif",
        ":o)" => "smilie07.gif",
        ":o" => "smilie07.gif"
       );
    
       // 
       $tags = array("pre", "input");
    
       $pos == 0;
       while($pos !== false) {
         $smallestpos = strlen($text);
         $smallestpostag = "";
         // find the first occurance of one of the $tags
         for($i = 0; $i < count($tags); $i++)
         {
           $pos2 = strpos($text, "<".$tags[$i], $pos);
           if(($pos2 > 0) && ($pos2 < $smallestpos)) {
            $smallestpos = $pos2;
            $smallestpostag = $tags[$i];
           }
         }
         $temp = substr($text, $pos, $smallestpos - $pos);
         $new = dosmiliestextpart($temp, $smiliesdot, $smiliessemicolon);
    
    
         $text = substr($text, 0, $pos).$new.substr($text, $smallestpos);
         if($smallestpostag == "") {
           $pos = false;
         }
         else {
           $pos = $pos + strlen($new);
           $pos3 = strpos($text, "/>", $pos);
           $pos4 = strpos($text, "<", $pos);
           if(($pos3 != false) && ($pos3 < $pos4)) {
             $pos = $pos4 + 2;
           }
           else {
             $pos = strpos($text, "</".$smallestpostag, $pos);
           }
         }
       }
       return $text;
     }
    Alles anzeigen

    Stefan

    Farben richtig wählen: ColorBlender
    Website validieren: W3C Markup Validation Service
    Meine Website: vbtricks
    Kleines Snake zwischendurch?

  • Modula
    Kaiserliche Hoheit
    Beiträge
    1.515
    • 30. September 2006 um 10:59
    • #5

    vbtricks, um in PHP einen Vergleich auf boolscher Ebene durchzuführen muss man === bzw. !== verwenden.

    Zoggerforum.de Betreuer * Mod @ ibforen.de * Admin @ daoc-ds.de
    ICQ Nummer kann via PN erfragt werden

  • vbtricks
    Kaiserliche Hoheit
    Beiträge
    1.586
    • 30. September 2006 um 11:10
    • #6

    Salut,

    ja, ich weiß. Verwende ich nur "==", konvertiert PHP. Und 0 entspricht dann gerade false.

    Normalerweise programmiere ich mit C#, da hab ich solche Probleme mit der Typensicherheit nicht.


    Stefan

    Farben richtig wählen: ColorBlender
    Website validieren: W3C Markup Validation Service
    Meine Website: vbtricks
    Kleines Snake zwischendurch?

Tags

  • bilder
  • gif
  • tex
  • text
  • post
  • funktion
  • input
  • smilies
  • version
  • code
  • tag
  • php
  • fehler
  • array
  • tags
  • schleife
  • border
  • while
  • false
  • ebene
  • offset
  1. Datenschutzerklärung
  2. Impressum
Community-Software: WoltLab Suite™
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche