1

愿你平安

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

发现了一个问题,但它有一个问题

    <?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 && all :)

更新 :

我修改了功能并运行良好,但是如果我在聊天消息中使用它想听听您的意见会很好吗?还是会面临问题?

      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);
4

3 回答 3

3

您可以简单地添加://到您的列表中:

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

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

因为strtr首先替换最长的键,所以 URL 不会受到影响


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

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

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

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

于 2013-01-29T23:04:09.707 回答
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" />
于 2013-01-29T23:33:12.243 回答
1

尝试将 ' 替换为 " 像这样:

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

如果不工作试试这个:

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

于 2013-01-29T23:00:01.943 回答