Preg_replace problem

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • helraizer1
    New Member
    • Mar 2007
    • 118

    Preg_replace problem

    Hey folks and folksesses,

    I have written some code to get emoticons onto my image based shoutbox but there is quite a large bug, as there is with any code in the early stages, and I need your help to narrow it down for me.

    The idea is that the script pulls data from the database - username, colour, font and shout to print '[username] shout' onto the image. This part of the code all works perfectly. Then it looks through each line at a time to see if there is either :D, :), :P or :( in the shout, if there is it finds the position of the string it's at, uses this data * a number to get the emote to the correct place on the image. After it has found that result and merged the emoticon onto the shoutbox, it deletes the :D, :), :P or :( from that shout, depending on which was used from the shout so that there is no overlapping of text and image.

    This works fine for the :D - the test post "Yay!! :D" gives this result (top line)



    Whereas the post "Yay!! :P" gives the result



    ^ it deletes the entire username and shout from the image and merges the :) emoticon into place.

    showimage_a.php

    [code=php]
    <?php
    $name = "[" . htmlspecialchar s_decode($row['username']) . "] "; //it works - returns username
    $font = $row['font']; //it works - renders the colour
    $color = $row['color']; //it works - changes the font
    $line = htmlspecialchar s_decode($row['comment']); //it works, posts the shout


    if ($name == "[] ")
    {
    $name = "";

    $line = $name . $line;
    }
    else
    {

    $line = $name . $line;
    }


    if (isset($_SESSIO N['sad'])) // not entirely implemented, does not register a session yet
    {

    $sad = $_SESSION['sad'];
    $sad_pos = strpos($line, $sad);

    if ($font == "palab") {
    $postb = $sad_pos * 5.4;
    } elseif ($font == "comicsans" ) {
    $postb = $sad_pos * 6.725;
    } else {
    }

    if (stristr($line, $sad))
    {

    imagecopymerge( $image, $sad_im, ($cur_line_x + $postb), (($cur_line_y + $lineheight) - 30), 0,
    0, 15, 15, 100);

    $line = preg_replace('/:(/', "", $line);
    }
    }

    if (isset($_SESSIO N['smiley']))
    {

    $smiley = $_SESSION['smiley'];
    $smile_pos = strpos($line, ":)");

    if ($font == "palab") {
    $posts = $smile_pos * 5.36;
    } elseif ($font == "comicsans" ) {
    $posts = $smile_pos * 6.725;
    } else {
    }

    if (stristr($line, $smiley))
    {

    imagecopymerge( $image, $smile_im, ($cur_line_x + $posts), (($cur_line_y + $lineheight) - 30), 0,
    0, 15, 15, 100);

    $line = preg_replace(': )', "", $line); //doesn't render on some occassions due to sessions - not causing this problem.
    }
    }


    if (isset($_SESSIO N['tongue']))
    {

    $tongue = $_SESSION['tongue'];
    $ton_pos = strpos($line, $tongue);

    if ($font == "palab") {
    $postt = $ton_pos * 5.1;
    } elseif ($font == "comicsans" ) {
    $postt = $ton_pos * 6.725;
    } else {
    }

    if (stristr($line, $tongue))
    {

    imagecopymerge( $image, $tongue_im, ($cur_line_x + $postt), (($cur_line_y + $lineheight) - 30), 0,
    0, 15, 15, 100);

    $line = preg_replace('/:P/', "", $line); //For some reason removes the entire $line and adds $smile_im to the image. *confused*
    }
    }


    if (isset($_SESSIO N['grin'])) {

    $grin = $_SESSION['grin'];
    $pos = strpos($line, $grin);

    if ($font == "palab") {
    $post = $pos * 5.7;
    } elseif ($font == "comicsans" ) {
    $post = $pos * 6.725;
    } else {
    }

    if (stristr($line, $grin)) {


    imagecopymerge( $image, $grin_im, ($cur_line_x + $post), (($cur_line_y + $lineheight)- 30.5), 0, 0,
    15, 15, 100);

    $line = preg_replace('/:D/', "", $line); // This bit works fine (gives the first result from Yay!! :D

    }

    }


    if ($color == "white" || $color == "yellow" || $color == "green" || $color ==
    "orange" || $color == "aqua")
    {
    Imagettftext($i mage, 10, 0, $cur_line_x, $cur_line_y, getColor($color ), getfont
    ($font), trim($line));


    }
    elseif ($color != "white" || $color != "yellow" || $color != "green" || $color !=
    "orange" || $color != "aqua")
    {
    Imagettftext($i mage, 10, 0, $cur_line_x, $cur_line_y, $white, getfont($font),
    trim($line));


    }
    elseif ($font == "fixedsys" || $font == "Courbd" || $font == "arial" || $font ==
    "timesnr" || $font == "calibri" || $font == "comicsans" || $font == "palab")
    {
    Imagettftext($i mage, 10, 0, $cur_line_x, $cur_line_y, getColor($color ), getfont
    ($font), trim($line));


    }
    else
    {
    Imagettftext($i mage, 10, 0, $cur_line_x, $cur_line_y, $white, "courbd.ttf ", trim
    ($line));


    }
    ?>
    [/code]

    Hope that makes sense.
    Any ideas?

    Please reply,
    Sam

    code=php tags not working again. =\
  • helraizer1
    New Member
    • Mar 2007
    • 118

    #2
    Fixed it!

    Simply changed preg_replace to str_replace.

    Always seems to be the simplest things..

    Thanks anyway,
    Sam

    Comment

    • hsriat
      Recognized Expert Top Contributor
      • Jan 2008
      • 1653

      #3
      Originally posted by helraizer1
      Fixed it!

      Simply changed preg_replace to str_replace.

      Always seems to be the simplest things..

      Thanks anyway,
      Sam
      Is that working if you have more then one same kind of smiley?

      :D :D :D :D or :) :) :) :)

      Comment

      • helraizer1
        New Member
        • Mar 2007
        • 118

        #4
        Originally posted by hsriat
        Is that working if you have more then one same kind of smiley?

        :D :D :D :D or :) :) :) :)

        Hmm.. you make a good point. No, it only allows one of each..

        Any solutions?

        Sam

        Comment

        • pbmods
          Recognized Expert Expert
          • Apr 2007
          • 5821

          #5
          Heya, Sam.

          It looks like your script is trying to 'replace' the smiley, I think by calculating where the emoticon text would be and replacing it with the graphic.

          I'm curious how it would handle a smiley in the middle of a line.

          E.g., "Ooh, I'm gonna mess with >:) your system!"

          Perhaps a better way would be to use preg_split() to divide up your string and then process it in chunks.

          E.g.,:
          [CODE=php]
          /** Note the fourth parameter. This means that the delimiters will also be included in $chunks! */
          $chunks = preg_split('/(:(?:\\)|P|D))/', $line, -1, PREG_SPLIT_DELI M_CAPTURE);

          /** If there's more than one element in $chunks, we have at least one smiley! */
          if( isset($chunks[1]) )
          {
          $i = 0;

          do
          {
          /** We know that even-indexed chunks are plain text, so we can automatically output those. */
          output_text($ch unks[$i]);

          /** Odd-indexed chunks are smileys. */
          if( isset($chunks[++$i]) )
          {
          output_smiley($ chunks[$i]);
          }
          }
          while( isset($chunks[++$i]);
          }
          [/CODE]

          Let's suppose $line was set to 'Smileys :) beautiful :P smileys :D'.

          Here's what $chunks would look like:
          [code=text]
          Array
          (
          [0] => Smileys
          [1] => :)
          [2] => beautiful
          [3] => :P
          [4] => smileys
          [5] => :D
          [6] =>
          )
          [/code]

          Note that all the even-indexed elements are plain text, and all the odd-indexed elements are smileys.

          Incidentally, I thought one of those Usernames was interesting. I can't remember which one it was, exactly... my mind's gone a bit... fuzzy.....
          Last edited by pbmods; Jun 1 '08, 04:44 AM. Reason: Fixed a grammatical error.

          Comment

          • helraizer1
            New Member
            • Mar 2007
            • 118

            #6
            Hey, pbmods.

            Yeah, I'll give that a try; have a mess around with it. There are a few bugs to be ironed out of my initial code, but sometimes the emoticon will appear in the space between the text in "Ooh, I'm going to mess with :@ your system" or whatever it may be. However sometimes it appears over the 'th' in the word 'with', because it's the string position * 5.7 (trial and error, that works on the most part).

            I shall give your way a go.

            As for the username, I've only put word filtering on the message. Reckon I should filter the username? :P

            Sam

            Comment

            Working...