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

7

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

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

但是,如果您输入一个链接,http://:/部分会被替换:

enter image description here

同样的,对于代码(每行前面有4个空格来创建代码框),但由于某种原因,一个简单的)也会被替换(带有一个眨眼的表情):

enter image description here

除了像这样替换所有图标之外,是否有更好的解决方法?显然这不起作用。我在Google上搜索了很多,没有找到更好的方法。我还尝试在上面的关联数组中在每个表情符号前加一个空格,但如果您只输入一个:)而没有任何其他字符,则无法正常工作。

5个回答

12
你可以使用 preg_replace 函数,然后在正则表达式中使用单词边界。
 foreach($icons as $icon=>$image) {
      $icon = preg_quote($icon);
      $text = preg_replace("~\b$icon\b~",$image,$text);
 }

您需要使用单词边界而不是空格,因为这将同时处理起始和结束点。在前面需要一个空格意味着将无法找到仅包含 :) 的情况。


3
实际上,我收回之前的话 - 对于 preg_quote 给一个赞,它太棒了! - Tim
那我应该将这个放在我的函数里,而不是使用 strtr() 吗?编辑:嗯,出于某种原因,现在没有图标被转换为图片了。我想知道是否有一种方法可以使代码框中的无文本表情符号转换为图像? - Nathan
Gmail聊天做得很好。你知道他们是使用正则表达式还是其他什么东西吗? - Nathan
Gmail几乎肯定是使用正则表达式来完成这个任务,但他们可能是在JavaScript层面上而不是在PHP中间层进行操作。如果我必须猜测的话,有一件事情你可以尝试去改变,看看是否有效,那就是将|作为正则表达式的边界字符,换成一个表情符号中没有的字符。对于我的错误回答,我很抱歉,已经做了修改。 - hackartist
由于您正在使用波浪号,应将其作为第二个参数传递给preg_quote。即 preg_quote($icon, '~'); - Wranorn

1

我不确定这是否有效,但我会尝试像这样添加一些额外的空格:

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

如果你在RETURN部分进行微调,这种方法会非常有效。返回修剪后的字符串,使用strtr函数替换其中的图标。 - Glenn J. Schworak

1
正则表达式在处理大文本时速度较慢,尽管我很喜欢使用它们,但你应该只在图标周围包含空格时才插入它们,这样写URL时就不会让用户感到烦躁了。

1

0

我认为使用正则表达式而不是仅仅定义你的表情符号会更好。这可能看起来像:

// replaces a :) when it is surrounded by whitespaces
return preg_replace('/\s:)\s/', '<img ...>', $text);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接