2013-05-28 3 views
1

J'analyse le message informel de style de conversation pour le sentiment et d'autres informations. J'ai besoin que toutes les émoticônes soient remplacées par leur signification réelle, afin de faciliter l'analyse du message par le système.PHP - Remplacer l'émoticône par la signification

Au moment où j'ai le code suivant:

$str = "Am I :) or :(today?"; 

$emoticons = array(
    ':)' => 'happy', 
    ':]' => 'happy', 
    ':(' => 'sad', 
    ':[' => 'sad', 
); 

$str = str_replace(array_keys($emoticons), array_values($emoticons), $str); 

Cela fait un remplacement de chaîne directe, et ne prend donc pas en compte si l'émoticône est entouré d'autres personnages.

Comment puis-je utiliser regex et preg_replace pour déterminer s'il s'agit réellement d'une émoticône et non d'une chaîne?

Comment puis-je étendre ma baie de sorte que l'élément happy par exemple puisse contenir les deux entrées; :) et :]?

Répondre

2

Pour la maintenabilité et la lisibilité, je changerais votre tableau émoticônes à:

$emoticons = array(
    'happy' => array(':)', ':]'), 
    'sad' => array(':(', ':[') 
); 

Ensuite, vous pouvez former une table de consultation comme vous avait à l'origine, comme ceci:

$emoticon_lookup = array(); 
foreach($emoticons as $name => $values) { 
    foreach($values as $emoticon) { 
     $emoticon_lookup[ $emoticon ] = $name; 
    } 
} 

Maintenant, vous pouvez créer une regex dynamiquement à partir du tableau de recherche d'émoticônes. Notez que cette regex requiert une limite non-mot entourant l'émoticône, changez-la en fonction de ce dont vous avez besoin.

$escaped_emoticons = array_map('preg_quote', array_keys($emoticon_lookup), array_fill(0, count($emoticon_lookup), '/')); 
$regex = '/\B(' . implode('|', $escaped_emoticons) . ')\B/'; 

Et puis utilisez preg_replace_callback() avec un rappel personnalisé pour mettre en œuvre le remplacement:

$str = preg_replace_callback($regex, function($match) use($emoticon_lookup) { 
    return $emoticon_lookup[ $match[1] ]; 
}, $str); 

Vous pouvez voir this demo que cette sortie:

Am I happy or sad today?