在PHP中替换表情符号的更好方法?

Nat*_*han 6 php strtr emoticons

现在我正在使用此函数表情符号:

function emoticons($text) {
        $icons = array(
                ':)'    =>  '<img src="/images/blank.gif" alt="smile" class="icon_smile" />',
                ':-)'   =>  '<img src="/images/blank.gif" alt="smile" class="icon_smile" />',
                ':D'    =>  '<img src="/images/blank.gif" alt="smile" class="icon_laugh" />',
                ':d'    =>  '<img src="/images/blank.gif" alt="laugh" class="icon_laugh" />',
                ';)'    =>  '<img src="/images/blank.gif" alt="wink" class="icon_wink" />',
                ':P'    =>  '<img src="/images/blank.gif" alt="tounge" class="icon_tounge" />',
                ':-P'   =>  '<img src="/images/blank.gif" alt="tounge" class="icon_tounge" />',
                ':-p'   =>  '<img src="/images/blank.gif" alt="tounge" class="icon_tounge" />',
                ':p'    =>  '<img src="/images/blank.gif" alt="tounge" class="icon_tounge" />',
                ':('    =>  '<img src="/images/blank.gif" alt="sad face" class="icon_sad" />',
                ':o'    =>  '<img src="/images/blank.gif" alt="shock" class="icon_shock" />',
                ':O'    =>  '<img src="/images/blank.gif" alt="shock" class="icon_shock" />',
                ':0'    =>  '<img src="/images/blank.gif" alt="shock" class="icon_shack" />',
                ':|'    =>  '<img src="/images/blank.gif" alt="straight face" class="icon_straight" />',
                ':-|'   =>  '<img src="/images/blank.gif" alt="straight face" class="icon_straight" />',
                ':/'    =>  '<img src="/images/blank.gif" alt="straight face" class="icon_straight" />',
                ':-/'   =>  '<img src="/images/blank.gif" alt="straight face" class="icon_straight" />'
        );
        return strtr($text, $icons);
    }
Run Code Online (Sandbox Code Playgroud)

但是,如果您输入链接,则替换:/部分http://:

在此输入图像描述

与代码相同(每行前面有4个空格来创建代码框),但由于某种原因,简单也)被替换(使用wink):

在此输入图像描述

有没有比这更换所有图标更好的解决方案呢?它显然不起作用.我在Google上搜索了很多,但没有找到更好的方法.我也试过在上面的关联数组中的每个表情符号之前放置一个空格,但是如果你只输入一个:)之前没有任何东西就行不通.

hac*_*ist 12

您可以使用preg_replace函数,然后在正则表达式中使用单词边界.

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

您需要使用单词边界而不是空格,因为这将处理起点和终点.需要一个空间才意味着只找到一个:).

  • 实际上,我把它拿回去 - [`preg_quote`] +1(http://php.net/preg_quote),这太棒了! (3认同)