用图像替换文字情感

时间:2013-01-29 22:51:28

标签: php

和平在你身上

我搜索了用图像替换文字情感

发现了硫化物,但它有一个问题

    <?php
     function emoticons($text) {
             $icons = array(
                     ':)'    =>  '<img src="/images/blank.gif" alt="smile" class="emo1" />',
                     ':-)'   =>  '<img src="/images/blank.gif" alt="smile" class="emo2" />',
                     ':/'    =>  '<img src="/images/blank.gif" alt="smile" class="emo3" />',
              );
            return strtr($text, $icons);
     }

     echo "http://stackoverflow.com good site:) :-)";

     ?>

它输出:(我不希望它那样做)

     "http<img src="/images/blank.gif" alt="smile" class="emo3" />/stackoverflow.com good site<img src="/images/blank.gif" alt="smile" class="emo1" /> <img src="/images/blank.gif" alt="smile" class="emo2" />"

我想输出

     "http://stackoverflow.com good site:) <img src="/images/blank.gif" alt="smile" class="emo2" />"

我认为它应该在文本之前或之后有空格然后替换它

在另一个问题中,正确的答案是

             foreach($icons as $icon=>$image) {
              $icon = preg_quote($icon);
              $text = preg_replace("~\b$icon\b~",$image,$text);
             }

但我使用它但结果没有任何图像

请帮帮我, 感谢stackoverflow&amp;&amp;全部:))

更新:

我修改了这个功能并且工作正常,但是想听听你的意见 如果我在聊天消息中使用它会好吗?或将面临问题?

      function emoticons($text) {
           $icons = array(
                          ':)'    =>  '<img src="/images/blank.gif" class="emo1"/>',
                          ':-)'   =>  '<img src="/images/blank.gif" class="emo1"/>',
                          ':/'   =>  '<img src="/images/blank.gif" class="emo3"/>',
                     );   
            $text = " ".$text." ";       
            foreach ($icons as $search => $replace){
             $text = str_replace(" ".$search." ", " ".$replace." ", $text);
            }
           return trim($text);
      }

      $str = ":)http://stackoverflow.com good site:) :-)";
      echo emoticons($str);

3 个答案:

答案 0 :(得分:3)

您只需将://添加到列表中即可:

'://' => '://',

并用相同的字符串替换它。

由于strtr首先替换最长的密钥,因此网址不会受到影响


好吧,如果您只想替换前面带空格的图标,可以尝试使用正则表达式:

foreach($icons as $icon => $image)              
  $text = preg_replace('#(?:^|\s)(' . preg_quote($icon) . ')(?:\s|$)#', $image, $text);

这将匹配任何以空格开头/或位于字符串开头的图标,后面跟一个空格/或位于字符串的末尾。

但是我不明白为什么你会这么想,像foo:)这样的文字也应该被视为笑脸。仅供参考我几乎没有为表情符号添加空格:)

答案 1 :(得分:2)

这个怎么样,只有当它作为字符串的开头或跟随一个空格时才会被替换:

function emoticons($text) {
    $icons = array(
        ':)'    =>  '<img src="/images/blank.gif" alt="smile" class="emo1" />',
        ':-)'   =>  '<img src="/images/blank.gif" alt="smile" class="emo2" />',
        ':/'    =>  '<img src="/images/blank.gif" alt="smile" class="emo3" />',
    );

    foreach ($icons as $search => $replace)
        $text = preg_replace("#(?<=\s|^)" . preg_quote($search) . "#", $replace, $text);

    return $text;
}

$str = "http://stackoverflow.com good site:) :-)";

echo emoticons($str);

输出:

http://stackoverflow.com good site:) <img src="/images/blank.gif" alt="smile" class="emo2" />

答案 2 :(得分:1)

尝试像这样替换'with':

':)' => "<img src="/images/blank.gif" alt="smile" class="emo1" />",

如果不能正常工作,请尝试:

":)" => '<img src="/images/blank.gif" alt="smile" class="emo1" />',