2012-03-11 62 views
5

现在我使用这个功能表情:更好的方式来替换PHP中的表情符号?

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上搜索了很多,并没有找到更好的方法。我也尝试在上面的关联数组中的每个表情符号之前放置一个空格,但如果你只是在没有任何东西的情况下输入:),那么这不起作用。

回答

12

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

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

您需要使用单词边界而不是白色空格,因为这会处理起始点和结束点。之前需要一个空间意味着只有一个:)将不会被发现。

+0

+1对于单词边界 - 但在'http:// www'的情况下'http'不会是一个单词,'/'是一个单词边界,所以':/'仍然会被过滤? – Tim 2012-03-11 20:59:50

+3

实际上,我把它回来了 - ['preg_quote'] +1(http://php.net/preg_quote),这太棒了! – Tim 2012-03-11 21:00:08

+0

所以我把它放在我的函数中而不是使用'strtr()'? **编辑:**嗯,出于某种原因,现在没有图标正在变成图像。我想知道是否有办法让文本表情符号在代码框中变成图像? – Nathan 2012-03-11 21:08:38

0

我认为使用regular expressions而不是只是定义你的表情符号。这可能看起来像

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

正则表达式是这个缓慢的,如果文本是大,就像我喜欢他们,如果它是由空间包围,你应该只插入一个图标,这样用户就不会暴动当试图写网址时。

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