2012-03-11 3 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://:/ 부분이 교체됩니다 링크를 입력하면 앞 4 자리 (코드

enter image description here

같은 코드 상자를 만들려면 각 줄마다). 그러나 어떤 이유로 단순한 )이 대체됩니다 (윙크 포함).

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 단어 경계는 +1하지만 'http : // www'는 단어가 아니며 '/'단어 경계이므로': /'는 여전히 필터링됩니까? – Tim

+3

실제로, 나는 그것을 다시 잡는다 - ['preg_quote'] (http://php.net/preg_quote)에 +1, 그것은 대단하다! – 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

나는 그것이 작동 여부를할지 모르겠지만, 나는 다음과 같은 몇 가지 여분의 공간을 넣어 시도 할 것 :

Emojify :

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); 
} 
관련 문제