Regex API twitter pour extraire hashtags, utilisateurs et URL

L’API twitter est d’une très facile en prendre en main. Elle est basée sur REST, il suffit donc de faire une requête HTTP avec les bons paramètres pour obtenir les informations que l’on a besoin. Il existe une multitude de librairies pour tous les langages de programmation. Vous trouverez une liste officiel sur le wiki de twitter. Pour l’utilisation avec PHP, j’utilise twitterlibphp.
Couplé avec de l’object SimpleXMLElement et avec un appel à la méthode xpath il est très facile d’obtenir la timeline d’un utilisateur. Malheureusement, le texte est statique. Les hashtags, les utilisateurs et les URL n’ont pas de liens vers les pages.
Vous pouvez utiliser le code suivant pour créer une liste de twitt avec les liens vers les URL ou vers les pages twitter correspondantes.

<?php
try{
   require_once('twitter.lib.php');
   $twitter = new Twitter('username', 'password');
   $xml = new SimpleXMLElement($twitter->getUserTimeline(array("count"=>"5")));
 
   $xmlNode = $xml->xpath('/statuses/status/text');
 
   echo '<ul>';
   foreach($xmlNode as $node){
      $twitt = $node[0]->asXML();
      if(preg_match_all("/((http(s?):\/\/|ftp:\/\/{1})([0-9a-zA-Z.\-]*\/?)*)/",
         $twitt,$val_url)){
         foreach($val_url[0] as $url){
            $twitt = str_replace($url,
               '<a href="'.$url.'" target="_blank">'.$url.'</a>',$twitt);
         }
      }
      if(preg_match_all("/#[a-zA-Z0-9_-]*/",$twitt,$val_hashtag)){
         foreach($val_hashtag[0] as $hashtag){
            $twitt = str_replace($hashtag,
               '<a href="http://search.twitter.com/search?q='.urlencode($hashtag).
               '" target="_blank">'.$hashtag.'</a>',$twitt);
         }
      }
      if(preg_match_all("/@[a-zA-Z0-9_-]*/",$twitt,$val_at)){
         foreach($val_at[0] as $at){
            $twitt = str_replace($at,'<a href="http://twitter.com/'.str_replace("@","",$at).
            '" target="_blank">'.$at.'</a>',$twitt);
         }
      }
 
      echo '<li>'.$twitt.'</li>';
   }
   echo '</ul>';
}catch(Exception $e){
   echo 'Twitter connection error';
}
?>

EDIT:

Merci @D3C4P5, Il semblerait que l’on peut optimiser ce code avec preg_replace :

<?php
try{
   require_once('twitter.lib.php');
   $twitter = new Twitter('username', 'password');
   $xml = new SimpleXMLElement($twitter->getUserTimeline(array("count"=>"5")));
 
   $xmlNode = $xml->xpath('/statuses/status/text');
 
   echo '<ul>';
   foreach($xmlNode as $node){
      $twitt = $node[0]->asXML();
      $twitt = preg_replace('#((http(s?):\/\/|ftp:\/\/{1})([0-9a-zA-Z.\-]*\/?)*)#i', 
            '<a href="$0" target="_blank">$0</a>', $twitt);
      $twitt = preg_replace('#@([a-zA-Z0-9_-]+)#i', 
            '<a href="http://twitter.com/$1" target="_blank">@$1</a>', $twitt);
      $twitt = preg_replace('#\#([a-z0-9_-]+)#i', 
            '<a href="http://search.twitter.com/search?q=%23$1" target="_blank">#$1</a>', 
            $twitt);
 
      echo '<li>'.$twitt.'</li>';
   }
   echo '</ul>';
}catch(Exception $e){
   echo 'Twitter connection error';
}
?>

Articles similaires :

Mots-clefs : , , , ,

6 commentaires sur “Regex API twitter pour extraire hashtags, utilisateurs et URL”

  1. Jeff_ dit :

    Salut

    Pourquoi ne pas simplement utiliser [^ ] comme masque de recherche pour les hashtags et urls ? il y a des caractères accentués aussi dans les hashtags et d’autres caractères (%?&;=, et même #!*+ pur ne citer qu’eux) dans les urls…
    Utiliser [^ ] est bien plus exhaustif et bien plus performant.

  2. Jeff_ dit :

    Ah et j’oubliais : le flag i signifie « insensible à la casse » donc le masque #@([a-zA-Z0-9_-]+)#i devrait être écrit soit #@([a-zA-Z0-9_-]+)# (sans le i) soit #@([a-z0-9_-]+)#i (sans l’intervalle de caractères majuscules)

  3. akrotux dit :

    J’ai testé le script en local avec easyphp, mais rien ne s’affiche,… page blanche ! é_è

Laisser une réponse