2012-03-11 1 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 места перед каждой строки, чтобы создать поле кода), но по какой-то причине заменяется простым : (0)

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

+3

На самом деле, я забираю это назад - +1 для ['preg_quote'] (http://php.net/preg_quote), это потрясающе! – Tim

+0

Итак, я поместил это в свою функцию вместо использования 'strtr()'? ** Редактирование: ** Хм, по какой-то причине никакие значки теперь не превращаются в изображения. Интересно, есть ли способ заставить текстовые смайлики превращаться в образы в кодовые окна? – Nathan

0

Я думаю, используя regular expressions вместо того, чтобы просто определять ваши смайлики. Это может выглядеть как

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

Регулярные выражения медленно для этого, если текст большой, так же, как я люблю их, вы должны вставить только значок, если он окружен пробелами, таким образом пользователи не будут бунт при попытке писать URL-адреса.

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