2012-03-11 12 views
5

In questo momento sto usando questa funzione per le emoticon:Un modo migliore per sostituire le emoticon in 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); 
    } 

Ma se si inserisce un link parte :/ di http:// viene sostituito:

enter image description here

Stessa cosa con il codice (4 spazi di fronte di ogni riga per creare la casella di codice), ma per qualche motivo un semplice ) viene sostituito (con un occhiolino) pure:

enter image description here

C'è una soluzione migliore a questo rispetto alla sostituzione di tutte le icone come questa? Ovviamente non funziona bene. Ho cercato su Google molto e non ho trovato alcun modo migliore. Ho anche provato a mettere uno spazio prima di ogni emoticon nell'array associativo in alto ma questo non funziona se si inserisce un :) senza niente prima di esso.

risposta

12

È possibile utilizzare la funzione preg_replace e quindi utilizzare i limiti di parola nell'espressione regolare.

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

è necessario utilizzare confini di parola e lo spazio non bianco, perché questo si prenderà cura dei punti di inizio e fine per. Avere bisogno di uno spazio prima significa che solo un :) non verrà trovato.

+0

+1 per i limiti delle parole - ma nel caso di 'http: // www' non sarebbe 'http' una parola, e'/'un limite di parola, quindi':/'verrebbe comunque filtrato? – Tim

+3

in realtà, lo prendo indietro - +1 per ['preg_quote'] (http://php.net/preg_quote), è fantastico! – Tim

+0

Così ho messo questo nella mia funzione invece di usare 'strtr()'? ** Modifica: ** Hmm, per qualche motivo nessuna icona viene trasformata in immagini ora. Mi chiedo se c'è un modo per non far diventare le emoticon di testo trasformate in immagini in caselle di codice? – Nathan

0

Penso di utilizzare regular expressions invece di definire solo le emoticon. Questo potrebbe sembrare

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

Le espressioni regolari sono lenti per questo se il testo è grande, tanto quanto mi piace loro, si dovrebbe solo inserire un'icona se è circondato da spazi, in questo modo gli utenti non rivolta quando provi a scrivere URL.

1

non sono sicuro se funzionerà o no, ma mi piacerebbe provare a mettere un po 'gli spazi in eccesso in questo modo:

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