2012-03-11 9 views
5

En este momento estoy usando esta función de emoticonos:¿Una mejor manera de reemplazar emoticones en 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); 
    } 

Pero si se introduce un enlace de la parte :/ de http:// es reemplazado:

enter image description here

mismo con código (4 espacios en el frente de cada línea para crear el cuadro de código), pero por alguna razón un simple ) se reemplaza (con un guiño) también:

enter image description here

¿Hay una mejor solución para esto que reemplazar todos los iconos como este? Obviamente no funciona bien. He buscado mucho en Google y no he encontrado una forma mejor. También traté de poner un espacio antes de cada emoticón en el conjunto asociativo anterior, pero eso no funciona si simplemente ingresas un :) sin nada antes.

Respuesta

12

Puede usar la función preg_replace y luego usar límites de palabras en la expresión regular.

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

Debe usar límites de palabras y no espacios en blanco porque esto se ocupará de los puntos de inicio y fin. Necesitar un espacio antes significa que solo un :) no se encontrará.

+0

+1 para límites de palabras - pero en el caso de 'http: // www' no 'http' sería una palabra, y'/'un límite de palabras, por lo que':/'todavía se filtraría? – Tim

+3

en realidad, lo tomo de vuelta - +1 para ['preg_quote'] (http://php.net/preg_quote), ¡eso es increíble! – Tim

+0

Entonces puse esto en mi función en lugar de usar 'strtr()'? ** Editar: ** Hmm, por alguna razón, ningún ícono se está convirtiendo en imágenes ahora. Me pregunto si hay alguna forma de que los emoticones de texto no se conviertan en imágenes en cuadros de códigos. – Nathan

0

Creo que usar regular expressions en lugar de solo definir tus emoticones. Esto podría parecer

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

Las expresiones regulares son lentos para esto si el texto es grande, tanto como me gustan, sólo se debe insertar un icono si está rodeado de espacios, de esa manera los usuarios no antidisturbios cuando intentas escribir urls.

1

no estoy seguro de si funcionará o no, pero que iba a tratar de poner algunos espacios adicionales como esto:

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