Le coefficient de Dice est une mesure de similarité (Article wikipedia: Dice's coefficient). Ce coefficient est utilisé en statistique pour déterminer la similarité entre deux échantillons. J'avais besoin d'utiliser ce coefficient pour l'un de mes projets, mais n'étant pas disponible de bases avec PHP, j'ai du créer une fonction que je vous livre ici.

Code PHPPrésentation du coefficient de Dice

Le coefficient est toujours compris entre 0 et 1. Il se définit comme le double de l'intersection de deux lots (échantillons de valeurs) divisé par l'union de ces deux lots. La formule ci-dessous résume la méthode de calcul:

Équation coefficient de Dice

Équation coefficient de Dice

Dans cette formule, X et Y sont des lots. Pour calculer le coefficient de Dice de deux chaines, il est possible de définir X et Y comme l'ensemble des bigrammes de chacune des chaines respectives. Un bigramme étant la réunion de deux lettres dans un mot.

Exemple d'utilisation

Prenons l'exemple de deux chaines "hello" et "allo", auquel ont souhaiterais déterminer le coefficient de Dice. Les bigrammes respectifs sont {he,el,ll,lo} (soit 4 bigrammes) et {al,ll,lo} (soit 3 bigrammes). L'intersection des deux lots sont les valeurs {ll,lo}. Ainsi, l'équation devient:

s = 2*2 /(4+3) = 4/7 = 0,57

Grâce à cette valeur de 0,57 il est possible de déterminer que ces deux mots sont à peu près semblables. Plus la valeur est proche de 1 et plus les chaines sont similaires. Si le résultat est égal à 1, cela signifie que les deux chaines sont identiques.

Code PHP du coefficient de Dice

Le code ci-dessous présente la fonction qui permet de calculer le coefficient de Dice avec PHP.

<?php
// Calcul du coefficient de Dice
// Inspiration: http://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Dice%27s_coefficient
// Licence: Libre de droit

function dice($str1='', $str2='')
{
    $str1_length = strlen($str1);
    $str2_length = strlen($str2);
   
    // Length of the string must not be equal to zero
    if ( ($str1_length==0) OR ($str2_length==0) )
        return 0;
   
    $ar1 = array();
    $ar2 = array();
    $intersection = 0;
   
    // find the pair of characters
    for ($i=0 ; $i<($str1_length-1) ; $i++)
        $ar1[] = substr($str1, $i, 2);
   
    for ($i=0 ; $i<($str2_length-1) ; $i++)
        $ar2[] = substr($str2, $i, 2);
   
    // find the intersection between the two sets
    foreach ($ar1 as $pair1) {
        foreach ($ar2 as $pair2) {
            if ($pair1 == $pair2)
                $intersection++;
        }
    }
   
    $count_set = count($ar1) + count($ar2);
    $dice = (2 * $intersection) / $count_set;
    return $dice;
}

echo dice('', 'cdefghi').'<br />'; // test with a null string
echo dice('abcdefg', '').'<br />'; // test with a null string
echo dice('abcdefg', 'cdefghi').'<br />';
echo dice('night', 'nacht').'<br />';
?>

La fin du script présente des exemples pour utiliser cette fonction. Avant de terminer, je tiens à préciser que je me suis inspiré d'un code en C++ provenant d'un wiki anglais: "Implementation of Dice's algorithm". Ce wiki présente l'implémentation du coefficient de Dice en C++, Java, Python et Ruby (mais pas en PHP, d'où l'intérêt du code que je viens de vous présenter). Faites-en bon usage.

Le coefficient de Dice est une mesure de similarité (Article wikipedia: Dice's coefficient). Ce coefficient est utilisé en statistique pour déterminer la similarité entre deux échantillons. J'avais besoin d'utiliser ce coefficient pour l'un de mes projets, mais n'étant pas disponible de bases avec PHP, j'ai du créer une fonction que je vous livre ici.

Présentation du coefficient de Dice

Le coefficient est toujours compris entre 0 et 1. Il se définit comme le double de l'intersection de deux lots (échantillons de valeurs) divisé par l'union de ces deux lots. La formule ci-dessous résume la méthode de calcul:

Équation coefficient de Dice

Équation coefficient de Dice

Dans cette formule, X et Y sont des lots. Pour calculer le coefficient de Dice de deux chaines, il est possible de définir X et Y comme l'ensemble des bigrammes de chacune des chaines respectives. Un bigramme étant la réunion de deux lettres dans un mot.

Exemple d'utilisation

Prenons l'exemple de deux chaines "hello" et "allo", auquel ont souhaiterais déterminer le coefficient de Dice. Les bigrammes respectifs sont {he,el,ll,lo} (soit 4 bigrammes) et {al,ll,lo} (soit 3 bigrammes). L'intersection des deux lots sont les valeurs {ll,lo}. Ainsi, l'équation deviens:

s = 2*2 /(4+3) = 4/7 = 0,57

Grâce à cette valeur de 0,57 il est possible de déterminer que ces deux mots sont à peu près semblable. Plus la valeur est proche de 1 et plus les chaines sont similaire. Si le résultat est égal à 1, cela signifie que les deux chaines sont identiques.

Code PHP du coefficient de Dice

dg

01.<span style="color: #ff0000;"><?php</span>
02.<span style="color: #008000;">// Calcul du coefficient de Dice
04.// Licence: Libre de droit</span>
05.
06.<span style="color: #0000ff;">function</span> dice(<span style="color: #000080;">$str1</span>='', <span style="color: #000080;">$str2</span>='')
07.{
08.<span style="color: #000080;">$str1_length</span> = strlen(<span style="color: #000080;">$str1</span>);
09.<span style="color: #000080;">$str2_length</span> = strlen(<span style="color: #000080;">$str2</span>);
10.
11.<span style="color: #008000;">// Length of the string must not be equal to zero</span>
12.<span style="color: #0000ff;">if</span> ( (<span style="color: #000080;">$str1_length</span>==0) <span style="color: #0000ff;">OR</span> (<span style="color: #000080;">$str2_length</span>==0) )
13.<span style="color: #0000ff;">return</span> 0;
14.
15.<span style="color: #000080;">$ar1</span> = <span style="color: #0000ff;">array</span>();
16.<span style="color: #000080;">$ar2</span> = <span style="color: #0000ff;">array</span>();
17.<span style="color: #000080;">$intersection</span> = 0;
18.
19.<span style="color: #008000;">// find the pair of characters</span>
20.<span style="color: #0000ff;">for</span> (<span style="color: #000080;">$i</span>=0 ; <span style="color: #000080;">$i</span><(<span style="color: #000080;">$str1_length</span>-1) ; <span style="color: #000080;">$i</span>++)
21.<span style="color: #000080;">$ar1</span>[] = substr($str1, $i, 2);
22.
23.<span style="color: #0000ff;">for</span> (<span style="color: #000080;">$i</span>=0 ; <span style="color: #000080;">$i</span><(<span style="color: #000080;">$str2_length</span>-1) ; <span style="color: #000080;">$i</span>++)
24.<span style="color: #000080;">$ar2</span>[] = substr($str2, $i, 2);
25.
26.<span style="color: #008000;">// find the intersection between the two sets</span>
27.<span style="color: #0000ff;">foreach </span>(<span style="color: #000080;">$ar1</span> as <span style="color: #000080;">$pair1</span>) {
28.<span style="color: #0000ff;">foreach </span>(<span style="color: #000080;">$ar2</span> as <span style="color: #000080;">$pair2</span>) {
29.<span style="color: #0000ff;">if </span>(<span style="color: #000080;">$pair1</span> == <span style="color: #000080;">$pair2</span>)
30.$intersection++;
31.}
32.}
33.
34.$count_set = count($ar1) + count($ar2);
35.$dice = (2 * $intersection) / $count_set;
36.<span style="color: #0000ff;">return </span>$dice;
37.}
38.
39.<span style="color: #0000ff;">echo </span>dice('', 'cdefghi').'<br />'; <span style="color: #008000;">// test avec une chaîne nulle</span>
40.<span style="color: #0000ff;">echo </span>dice('abcdefg', '').'<br />'; <span style="color: #008000;">// test avec une chaîne nulle</span>
41.<span style="color: #0000ff;">echo </span>dice('abcdefg', 'cdefghi').'<br />';
42.<span style="color: #0000ff;">echo </span>dice('night', 'nacht').'<br />';
43.<span style="color: #ff0000;">?></span>

Inspiration:

http://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Dice%27s_coefficient

Les crawlers de fichiers ont un intérêt pour lister rapidement toutes les pages ou images d'un site web. Cela permet d'automatiser la tache qui peut être longue et pénible s'il fallait le faire manuellement. Cet article présente un crawler qui liste tous type de fichier présent sur votre espace d'hébergement.

Présentation

Le script fournit sur cet article est à installer à la racine d'un site web, puis il suffit de l'ouvrir avec un navigateur web pour voir s'afficher la liste de tous les fichiers présent.

Sur le web il existe une multitude de crawler qui fouille sur une page web distante, mais il y a moins de projet (à ma connaissance) qui s'installe directement sur le serveur d'un site et qui liste les fichiers en interne du site. Cela possède l'avantage de pouvoir lister les pages et fichiers orphelins (qui ne sont pas utilisée ou liée au site web).

Type d'utilisation envisageable:

  • Chercher un dossier ou fichier
  • Générer automatiquement le sitemap du site ou le plan du site. Pas besoin de mettre à jour ce plan du site puisqu'il est généré automatiquement à chaque fois.
    Si ce script est adapté, il peut tout aussi bien générer un sitemap de pages web ou un sitemap d'images
  • En adaptant le script, il est possible d'ouvrir toutes les pages PHP d'un coup. Cela peut être utile pour faire des recherches ou modifications sur toutes les pages d'un site en même temps.
    Par exemple, ce script peut être utilisé si vous avez 500 pages, que vous modifier l'URL d'une de ces pages et que vous souhaitez mettre à jour toutes les pages web sur lesquels est présent l'ancienne URL

Télécharger

Le lien ci-dessous permet de télécharger le script. Une fois téléchargé, il suffit de le dézipper et de le placer à la racine de votre site.

(Fichier compressé. 2,01Ko)

J'ai l'intention dans les prochains jours de donner des exemples d'utilisation et des modifications possible de ce script.

Cet article propose une traduction française de la base de données IP-to-Country, permettant de relier une adresse IP à un pays. Cet article est la suite logique du précédent article publié sur ce blog, intitulé "Connaître le pays d’une adresse IP".

Présentation

Le souci majeur de la base de données de IP-to-Country, c'est qu'elle est exclusivement en anglais et que les noms de pays sont tous en majuscules (ce qui réduit la lisibilité et diminue le professionnalisme). Pour remédier à ces soucis j'ai créé une seconde base de données de traduction, permettant de réellement pouvoir utiliser IP-to-Country sur des sites web francophones.

Intérêt

Cette seconde base de données SQL est plus simple que la base de données de IP-to-Country pour la simple raison qu'elle recense les pays et non les adresses IP.

Sachant que IP-to-Country met à jours sa base de données assez régulièrement, ce serait une énorme perte de temps de traduire chaque nouvelles versions. Cette traduction à alors l'avantage d'être de bonne qualité à travers le temps. Pour mettre à jour les données, il faudra juste mettre à jour la base de données de IP-to-Country.

(Base de données SQL de 7,99Ko)

Exemple d'utilisation

Grâce à cette traduction, il est possible de créer un code PHP qui indique le pays d'origine d'un visiteur. Le tout étant bien évidemment en français. Le code ci-dessous utilise PHP 5 pour réaliser une telle application.

<?php
/*
Message de copyright obligatoire:
"This 'work' uses the IP-to-Country Database
 provided by WebHosting.Info (http://www.webhosting.info),
 available from http://ip-to-country.webhosting.info."
*/
// Connexion à la base de donnée (à adapter)
$link = mysqli_connect("localhost", "my_user", "my_password", "my_db");

// Fonction permettant de convertir l'adresse IP en un format numérique
function ipAdressNumber($dotted){
 $dotted = preg_split( "/[.]+/", $dotted);
 $ip = (double) ($dotted[0]*16777216)+($dotted[1]*65536)+($dotted[2]*256)+($dotted[3]);
 // IP Number = A x (256*256*256) + B x (256*256) + C x 256 + D
 return $ip;
}

$ip = $_SERVER['REMOTE_ADDR']; // Adresse IP du visiteur
echo 'Adresse IP: '.$ip.'<br />';
$ip = ipAdressNumber($ip); // Utilisation de la fonction pour convertir l'adresse IP

// Sélection des données dans la base de données. Si l'IP est comprise entre IP_FROM et IP_TO
$result = mysqli_query($link, "SELECT * FROM ip_to_country WHERE $ip BETWEEN IP_FROM AND IP_TO ") or die (mysqli_error($link));
$data = mysqli_fetch_array($result); // $data['COUNTRY_NAME'] contient le nom du pays en Anglais

// Utilisation de la seconde base de données pour traduire le nom du pays
$result2 = mysqli_query($link, "SELECT COUNTRY_NAME_FR FROM ip_pays_fr WHERE COUNTRY_NAME='".addslashes($data['COUNTRY_NAME'])."' ") or die (mysqli_error($link));
$data2 = mysqli_fetch_array($result2);
echo 'Pays: <strong>'.$data2['COUNTRY_NAME_FR'].'</strong>'; // Affichage du pays du visiteur (en français)

mysqli_close($link);
?>

Mot de la fin

Pour voir un exemple concret de l'application de cette base de données, je vous recommande de consulter la page "Mon adresse IP" du site InfoWebMaster. Cette dernière indique l'adresse IP de l'utilisateur ainsi que quelques petites informations supplémentaires.

Il est parfois utile de pouvoir localiser géographiquement une adresse IP. Cela peu par exemple être utile pour localiser un visiteur ou pour localiser des serveurs. Cet article présente deux tutoriaux PHP qui exploite une base de donnée pour associer une adresse IP à son pays.

Intérêt de localiser une adresse IP

Il y a plusieurs raisons qui motivent l'utilisation de la localisation de l'adresse IP. La liste ci-jointe n'est pas exhaustive mais inclue des exemples d'utilisations très probables:

  • Localiser le visiteur d'un site web. Avec cette information il est possible de personnaliser le contenu pour cet internaute (utiliser l'unité monétaire de son pays, suggérer une version du site dans la langue officielle de son pays ...).
  • Cibler l'audience d'une annonce en ligne.
  • Détection automatique d'un champ de formulaire (exemple: choix du pays pré-remplis).
  • Connaitre l'emplacement géographique du serveur d'un site web (exemple: peut être utile pour le référencement).
  • Filtrer les visiteurs selon leur localité.
  • Réduire le spam / Réduire les fraudes bancaires.

Base de données

Pour associer une adresse IP à un pays, il faut se baser sur une base de données qui répertorie des plages d'adresses IP à un pays. La base de données de IP-to-Country (anciennement ip-to-country.com) est relativement précise, complète et mise à jour régulièrement.

Pour réaliser les tutoriaux présents dans la suite de cet article, il est indispensable de télécharger la base de données suivante et de la mettre en place sur son espace d'hébergement.

(Base de données SQL de 5,23Mo)

Pays d'origine d'un visiteur

L'utilisation la plus populaire de cette base de données consiste à localiser le pays d'origine d'un visiteur. Le code PHP suivant fonctionne avec PHP 5.

<?php
/*
Message de copyright obligatoire:
"This 'work' uses the IP-to-Country Database
 provided by WebHosting.Info (http://www.webhosting.info),
 available from http://ip-to-country.webhosting.info."
*/
// Connexion à la base de donnée (à adapter)
$link = mysqli_connect("localhost", "my_user", "my_password", "my_db");

// Fonction permettant de convertir l'adresse IP en un format numérique
function ipAdressNumber($dotted){
 $dotted = preg_split( "/[.]+/", $dotted);
 $ip = (double) ($dotted[0]*16777216)+($dotted[1]*65536)+($dotted[2]*256)+($dotted[3]);
 // IP Number = A x (256*256*256) + B x (256*256) + C x 256 + D
 return $ip;
}

$ip = $_SERVER['REMOTE_ADDR']; // Adresse IP du visiteur
echo 'Adresse IP: '.$ip.'<br />';
$ip = ipAdressNumber($ip); // Utilisation de la fonction pour convertir l'adresse IP

// Sélection des données dans la base de données. Si l'IP est comprise entre IP_FROM et IP_TO
$result = mysqli_query($link, "SELECT * FROM ip_to_country WHERE $ip BETWEEN IP_FROM AND IP_TO ") or die (mysqli_error($link));
$data = mysqli_fetch_array($result);
echo 'Pays: <strong>'.$data['COUNTRY_NAME'].'</strong>'; // Affichage du pays du visiteur

mysqli_close($link);
?>

Localisation d'un serveur

Pour une application ou pour le référencement, il peut se révéler utile de savoir dans quel pays se situe le serveur d'un site web. En connaissant le nom de domaine d'un site, le code suivant retourne l'adresse IP du serveur. Cette adresse IP peut alors permettre de localiser le serveur grâce à la base de données.

<?php
/*
Message de copyright obligatoire:
"This 'work' uses the IP-to-Country Database
 provided by WebHosting.Info (http://www.webhosting.info),
 available from http://ip-to-country.webhosting.info."
*/
// Connexion à la base de donnée (à adapter)
$link = mysqli_connect("localhost", "my_user", "my_password", "my_db");

// Fonction permettant de convertir l'adresse IP en un format numérique
function ipAdressNumber($dotted){
 $dotted = preg_split( "/[.]+/", $dotted);
 $ip = (double) ($dotted[0]*16777216)+($dotted[1]*65536)+($dotted[2]*256)+($dotted[3]);
 // IP Number = A x (256*256*256) + B x (256*256) + C x 256 + D
 return $ip;
}

$ip = gethostbyname('www.infowebmaster.fr'); // Adresse IP du serveur du site www.infowebmaster.fr
echo 'Adresse IP: '.$ip.'<br />';
$ip = ipAdressNumber($ip); // Utilisation de la fonction pour convertir l'adresse IP

// Sélection des données dans la base de données. Si l'IP est comprise entre IP_FROM et IP_TO
$result = mysqli_query($link, "SELECT * FROM ip_to_country WHERE $ip BETWEEN IP_FROM AND IP_TO ") or die (mysqli_error($link));
$data = mysqli_fetch_array($result);
echo 'Pays: <strong>'.$data['COUNTRY_NAME'].'</strong>'; // Affichage du pays du serveur

mysqli_close($link);
?>

Il est possible de constater que ce code diffère très peu du code précédent qui consistait à déterminer le pays d'origine d'un visiteur.

Continuation

Cette base de données est très intéressante mais possède l'inconvénient d'être exclusivement en anglais. De plus, les pays sont écrits en majuscules, ce qui n'est pas très esthétiques et facile à lire. Il est possible d'améliorer ce travail en créant une base de données permettant de traduire le nom des pays.

Mise à jour 21 février 2010: Pour traduire le nom des pays en français, j'ai créé une base de données de traduction de IP-to-Country. Cela est idéal pour afficher convenablement le nom des pays aux visiteurs.

Cet article va présenter une petite application Twitter permettant de récupérer les tweets d'un compte et d'y afficher - si disponible - les petites discutions entre utilisateurs. Les fichiers du script peuvent être téléchargés (voir à la fin de cet article) et installer sur un hébergement web assez facilement. De ce fait, tout le monde peut avoir son propre petit lecteur de Tweets utilisant AJAX.

Logo de Twitter

Logo de Twitter

Prérequis

Pour comprendre le code source de ce script il est recommandé d'avoir consulté l'article intitulé "extraire les tweets en AJAX" car le code présenté ici est basé en grande partie sur ce précédent script. La principale différence c'est que le lecteur de tweets de cet article récupère des messages supplémentaires. Lorsque sur Twitter un utilisateur répond à quelqu'un, ce script récupère l'autre message pour mieux comprendre le contexte de la réponse.

En raison de la longueur du fichier PHP (environ 100 lignes) le code ne sera pas détaillé sur cet article. Les principales difficultés comprises dans le code PHP ont par ailleurs déjà été expliquées dans des articles précédents.

Télécharger les fichiers de ce script

Pour réaliser ce petit lecteur de tweets il faut 6 fichiers, incluant une page html, un fichier PHP, un fichier javascript et un fichier CSS pour donner un petit design à l'application. Le fichier compressé de l'application fait 6Ko et peut être téléchargé grâce au bouton ci-dessous.

L'installation est assez simple, il suffit de télécharger les fichiers, les décompresser et les envoyer sur un espace d'hébergement.

jan 31

API de Untiny

Untiny est un service gratuit permettant de connaitre l'adresse original d'une URL raccourci. Il est possible d'utiliser le service manuellement, cependant l'API de Untiny mise à la disposition des développeurs peut se révéler utile pour automatiser le processus (exemple: pour un client Twitter). Cet article didactique va expliquer comment utiliser l'API à travers une application AJAX.

Présentation

Logo de Untiny

Logo de Untiny

Cet article va présenter uniquement le code PHP pour utiliser l'API de Untiny. Le reste du code AJAX peut être trouvé sur un précédent article publié sur ce blog, intitulé "Dé-raccourcisseur d’url".

Les intérêts de ce nouveau code, par rapport à l'ancien article, sont multiples:

  • Le service Untiny est complet et performant. Ce service supporte de nombreux raccourcisseur d'URL.
  • Réduit la charge serveur. En utilisant un service externe, le script du serveur demande moins de ressources.
  • Certains hébergeurs désactivent l'option cURL. De ce fait, l'ancien code ne pouvait pas être utilisé par tous.

Prérequis

Pour comprendre le code PHP qui va suivre il faut avoir des connaissances en PHP. De plus, pour réaliser l'application AJAX il faut utiliser le reste du code qui a été présenté sur l'article "Dé-raccourcisseur d’url".

Code PHP

Le code PHP récupère dans un premier temps l'URL qu'il faut dé-raccourcir (exemple: http://tiny.pl/htk). La fonction api_untiny() s'occupe d'extraire l'URL présente dans le fichier XML de l'API.

<?php
$url=trim(strip_tags($_GET['url']));

function api_untiny($url)
{
 $urlAPI = 'http://untiny.me/api/1.0/extract/?url='.$url;

 if ($XML = @simplexml_load_file( $urlAPI )){
 return $XML->org_url; // Retourne l'URL entière
 }
}

$url_retour = api_untiny($url);
echo '<a href="'.$url_retour.'">'.$url_retour.'</a>'; // Affiche l'URL
?>

Télécharger l'application

Toute l'application AJAX peut être téléchargée grâce au lien ci-dessous. Mais il est également possible de ce servir uniquement d'une code PHP pour toute utilisation qui vous semble appropriée.

Pour utiliser l'application AJAX il faut télécharger le fichier zippé, le décompresser et l'envoyer sur un espace d'hébergement web.

Avec la popularisation de Twitter, il n'y a jamais eu autant de services en ligne permettant de raccourcir les URL. Très pratique lorsqu'il s'agit d'économiser de la place dans un tweet, ces URL possèdent néanmoins un gros défaut: il n'est pas possible de savoir avec précision où l'URL emmène. Pour résoudre cette problématique, ce tutorial présente un script AJAX qui permet de dé-raccourcir une URL.

Présentation

Une page d'exemple est disponible. Notez toutefois que le script n'a pas été testé avec tous les services permettant de raccourcir une URL. Il fonctionne uniquement sur les raccourcisseurs d'URL qui font des redirections 301 ou 302 (redirection Javascript pas prise en compte par le script).

Prérequis

Il est préférable d'avoir des connaissances en AJAX pour pouvoir comprendre le script. Cependant en connaissant uniquement le PHP, il est possible de comprendre à peu près le script. Dans les archives de ce blog il est possible de découvrir des tutoriaux d'initiation qui sont parfait pour les débutants. N'hésitez pas par exemple à consulter les articles de la catégorie AJAX.

Code

Code xHTML

Le code xHTML est assez simple, il faut juste avoir un formulaire pour envoyer la petite URL et un <div> pour pouvoir afficher le résultat dynamiquement (avec Javascript).

<form method="post" action="" enctype="multipart/form-data">
<label>URL: <input type="text" name="url" id="url" /></label> <input onclick="displayURL(url.value)" type="button" value="Dé-raccourcir l'URL" />
</form>

<div id="afficherURL"></div>

Code Javascript

Le code Javascript est un peu élaboré puisqu'il doit récupérer les informations dynamiquement.

function file(fichier)
{
 if(window.XMLHttpRequest) // FIREFOX
 xhr_object = new XMLHttpRequest();
 else if(window.ActiveXObject) // IE
 xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
 else
 return(false);
 xhr_object.open("GET", fichier, false);
 xhr_object.send(null);
 if(xhr_object.readyState == 4) return(xhr_object.responseText);
 else return(false);
}

function displayURL(url)
{
 // Afficher une image pendant le chargement
 window.document.getElementById("afficherURL").innerHTML = "<img src=\"Loading-transparent.gif\" alt=\"icône chargement\" />";

 if (url != false){ /* Si l'utilisateur à bien inscrit l'URL */
 var url = "afficher-url.php?url="+url; /* Adresse du fichier .php */
 var obj = file(url); /* Récupère le résultat (la longue URL) */
 /* le résultat est affiché dans un div (.result) qu'il est possible de personnaliser avec CSS */
 window.document.getElementById("afficherURL").innerHTML = "<div class=\"result\">"+obj+"</div>";
}
else
 window.document.getElementById("afficherURL").innerHTML = "Erreur";
}

Note: L'image de chargement est la suivante (vous pouvez la prendre elle est libre de droit):

Image de chargement avec AJAX

Code PHP

Version 1 (nécessite PHP 5)

Ce code est une mise à jour de l'article suite à la suggestion de Seebz dans les commentaires. Il existe une fonction en PHP 5 intitulé get_headers(). Cette dernière facilite grandement le script.

<?php
$url=trim(strip_tags($_GET['url']));

function analyseur_header_http($url)
{
 $headers = get_headers($url,1);
 if (is_array($headers['Location'])) // Retourne true si $headers['Location'] est un array
 return end($headers['Location']);
 else
 return $headers['Location'];
}

$url_retour = analyseur_header_http($url);
echo '<a href="'.$url_retour.'">'.$url_retour.'</a>';
?>

Cette fonction à l'avantage de retourner la dernière URL dans le cas où il y a plusieurs redirection à la suite.

Version 2 (idéal pour PHP 4)

Ce code alternatif est est un peu moins efficace mais il est pratique dans le cas où vous n'avez pas PHP 5. Le code utilise curl pour extraire le contenu de la page.  Il faut donc s'assurer dans un premier temps que l'hébergeur accepte l'utilisation de cette ressource (certains hébergeurs empêchent l'utilisation de cette ressource qui consomme trop). L'extraction de la page sert à récupérer le texte inclue dans l'entête HTTP. C'est dans cet entête qu'il y a la page de redirection (la longue URL). Le code PHP récupère alors cette adresse et l'affiche pour qu'elle soit utilisée dans le fichier Javascript.

<?php
$url=trim(strip_tags($_GET['url']));

function analyseur_header_http($url)
{
 $ch = curl_init(); // Initialise une nouvelle session cURL

 // Options de transfert cURL
 curl_setopt($ch, CURLOPT_URL, $url);
 curl_setopt($ch, CURLOPT_HEADER, true);
 curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);

 $en_tete = curl_exec($ch); // Exécute la session cURL

 curl_close($ch); // Fermeture cURL

 if ($en_tete==true){
 $position = strpos($en_tete, '<'); // récupère la position du caractère "<"
 $en_tete = substr($en_tete, 0, $position); // récupère seulement l'entête HTTP
 }

 $en_tete = nl2br($en_tete);
 preg_match('#Location: (.+)\<br /\>#isU', $en_tete, $url_retour_array); // Extraire l'URL
 $url_retour = '<a href="'.$url_retour_array[1].'">'.$url_retour_array[1].'</a>';

 return $url_retour; // Retourne l'URL entière
}

echo analyseur_header_http($url); // Utilisation de la fonction analyseur_header_http()
?>

Télécharger le script

Pour éviter de se perdre avec les fichiers et les différents scripts, un fichier zippé contenant tout ce qui est nécessaire à l'exécution du script peut être téléchargé:

L'utilisation est simple. Il suffit de décompresser les fichiers et de les uploader sur un site web.

Les flux RSS sont utiles pour suivre l'actualité d'un site web. Sachant qu'ils contiennent les informations liés aux articles d'un site, il peut se révéler pratique d'extraire le contenu d'un flux RSS pour en afficher une liste des articles avec un lien vers ceux-ci. L'objectif de cet article consiste à créer un simple code PHP qui sert d'agrégateur RSS.

ElePHPant

ElePHPant

Prérequis

Il faut avoir quelques notions avec le langage de programmation PHP et avoir un hébergement qui prend en compte PHP 5.

Code PHP

Le code PHP, qui ne fait que 8 lignes, est visible ci-dessous.

<?php
$url = "http://tonyarchambeau.com/blog/feed/"; /* insérer ici l'adresse du flux RSS de votre choix */
$rss = simplexml_load_file($url);
echo '<ul>';
foreach ($rss->channel->item as $item){
 $datetime = date_create($item->pubDate);
 $date = date_format($datetime, 'd M Y, H\hi');
 echo '<li><a href="'.$item->link.'">'.utf8_decode($item->title).'</a> ('.$date.')</li>';
}
echo '</ul>';
?>

Démonstration

Dans un premier temps ce code extrait les informations du flux RSS et convertit le document XML en un objet. Puis la boucle foreach permet d'exploiter les informations présentent dans les balises <item> (dans un flux RSS chaque article est inclus dans une balise <item>).

A l'intérieur de la boucle foreach, il y a il ne reste plus qu'à afficher les informations souhaités. Dans l'exemple ci-présent trois informations sont extraites: le lien vers l'article, le titre de l'article et la date de publication.

Personnaliser

Il est possible d'utiliser plus d'informations si celles-ci sont disponibles dans le flux RSS. Le tableau ci-dessous présente les métadonnées qui sont souvent inclussent dans un fil RSS avec une description.

Métadonnée Nécessité Description Exemple
<title> Obligatoire Titre de l'article [Twitter] Extraire les tweets en AJAX
<link> Recommandé Adresse internet lié à l'article. http://tonyarchambeau.com/blog/ajax/twitter-extraire-les-tweets-en-ajax-94/
<pubDate> Facultatif Date de publication de l'article. Tue, 12 Jan 2010 16:24:11 +0000
<description> Obligatoire Cette balise peut tout aussi bien contenir une brève description de l'actualité ou bien l'article en entier. Certains sites préfère dévoiler un extrait tandis que d'autres mettent l'intégralité des articles dans le flux RSS. Le choix peut se révéler très stratégique. <![CDATA[Le service Twitter est très pratique pour publier des courts messages. Il est entre autres utile pour la veille technologique. Parfois il se révèle intéressant de consulter les derniers messages d'un compte Twitter. Cet article présente un tutorial pour réaliser une petite application AJAX qui affiche les derniers messages d'un compte Twitter de votre choix. [...]]]>
<guid> Facultatif Définit un identifiant unique pour l'objet. http://tonyarchambeau.com/blog/?p=94
<author> Facultatif Contient l'adresse email de l'auteur. auteur@example.com
<category> Facultatif Définit la catégorie de l'article. <![CDATA[PHP]]>
<comments> Facultatif Définit l'adresse d'une page web sur laquelle se trouve les commentaires liés à l'article. http://tonyarchambeau.com/blog/ajax/twitter-extraire-les-tweets-en-ajax-94/#comments

Pour utiliser l'une ou l'autre des métadonnées dans le code présenté sur cette page web, il suffit de reprendre le nom de l'objet. Par exemple, pour inclure la description il suffit d'utiliser la variable "$item->description" à l'intérieur de la boucle foreach du code présent sur cette page.

Amélioration supplémentaire

Il est possible d'améliorer le code présenté sur cet article. Pour commencer il est possible de personnaliser l'aspect en modifiant le xHTML/CSS, puis le format de la date. Enfin, certaines fonctionnalité supplémentaires peuvent être ajoutées, tel que l'ajout d'autres métadonnées présenté dans le tableau.

Le service Twitter est très pratique pour publier des courts messages. Il est entre autres utile pour la veille technologique. Parfois il se révèle intéressant de consulter les derniers messages d'un compte Twitter. Cet article présente un tutorial pour réaliser une petite application AJAX qui affiche les derniers messages d'un compte Twitter de votre choix. Cela ne se veut pas parfait, mais plutôt une introduction pour pouvoir réaliser, plus tard, de plus ample interface.

Logo de Twitter

Logo de Twitter

Démonstration

Le script de démonstration vous permet de tester et de visualiser ce que vous serez capable de réaliser à la fin de ce tutorial:

Prérequis

Il est recommandé d'avoir des connaissances en PHP, AJAX (Javascript) et d'avoir consulté le précédent article publié sur ce blog intitulé "[Twitter] Afficher les derniers tweets grâce à PHP". Ce dernier, présentait un script PHP qui utilisait l'API Twitter pour afficher les derniers messages d'un compte Twitter grâce à PHP. Ce tutorial se base en grande partie sur le précédent script.

Code xHTML

La première partie de ce tutorial consiste à réaliser une page xHTML qui comporte les éléments suivants:

  • Un champ de formulaire pour indiquer le nom du compte Twitter sur lequel il faudra extraire les messages
  • Un bouton pour lancer le script
  • Un <div> qui contient un id sur lequel le code AJAX viendra afficher les résultats.

Voici un code qui respecte les conditions annoncé ci-dessus:

<form method="post" action="" enctype="multipart/form-data">
<input type="text" name="pseudo" id="pseudo" /> <input onclick="displayTweets(pseudo.value)" type="button" value="Afficher les messages" />
</form>

<div id="afficherTweets"></div>

Il est importer de noter le nom de la futur fonction javascript displayTweets() qui est appelé en cliquant sur le bouton intitulé "Afficher les messages".

Code Javascript

Le code javascript possède deux fonctions. La première function appelé file() est tout simplement une fonction qui permet d'ouvrir dynamiquement un fichier. La seconde n'est autre que la fonction displayTweets() présentée qui est appelé dans le code xHTML lors du clic sur le bouton.

function file(fichier)
{
 if(window.XMLHttpRequest) // FIREFOX
 xhr_object = new XMLHttpRequest();
 else if(window.ActiveXObject) // IE
 xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
 else
 return(false);
 xhr_object.open("GET", fichier, false);
 xhr_object.send(null);
 if(xhr_object.readyState == 4) return(xhr_object.responseText);
 else return(false);
}

function displayTweets(pseudo)
{
 window.document.getElementById("afficherTweets").innerHTML = "<img src=\"Loading-transparent.gif\" alt=\"icône chargement\" />"; /* Affiche une image de chargement */

 if (pseudo != false){ /* Si l'utilisateur à bien inscrit le nom d'un compte dans le champ du formulaire */
 var url = "afficher-tweets.php?pseudo="+pseudo; /* Le script PHP est présent sur la page afficher-tweets.php */
 var obj = file(url); /* la variable obj récupère les informations de la page afficher-tweets.php */

 window.document.getElementById("afficherTweets").innerHTML = obj; /* Affiche les tweets */
 }
 else
 window.document.getElementById("afficherTweets").innerHTML = "Erreur";
}

Note: Comme vous pouvez le voir, à un moment donné une image est affichée à l'écran. Il s'agit d'une image animée qui est affiche pendant que le script récupère les informations provenant de Twitter. Cette image est libre de droit, n'hésitez pas à la télécharger:

Image de chargement avec AJAX

Code PHP

La dernière partie de ce tutorial consiste à créer le code PHP. Dans un premier temps il faut penser à créer une page PHP qui comporte le même nom que celui utilisé dans le code javascript, c'est-à-dire "afficher-tweets.php". Comme expliqué au début de l'article, le script PHP se base en grande partie sur le code PHP qui a été réalisé sur l'article "[Twitter] Afficher les derniers tweets grâce à PHP". De ce fait, si vous rencontré des difficultés je vous suggère de consulter l'article précédent. Voici le script PHP:

<?php
$user = htmlspecialchars($_GET["pseudo"]); /* Récupère le pseudo inscrit sur le champ du formulaire */

function parse($text)
{
 $text = preg_replace('#http://[a-z0-9._/-]+#i', '<a href="$0">$0</a>', $text);
 $text = preg_replace('#@([a-z0-9_]+)#i', '@<a href="http://twitter.com/$1">$1</a>', $text);
 $text = preg_replace('# \#([a-z0-9_-]+)#i', ' #<a href="http://search.twitter.com/search?q=%23$1">$1</a>', $text);
 return $text;
}

$count = 8;
$date_format = 'd M Y, H:i:s';
$url = 'http://twitter.com/statuses/user_timeline/'.$user.'.xml?count='.$count;

if ($XML = @simplexml_load_file( $url )){ /* Rentre dans la fonction s'il n'y a pas d'erreur lorsque les données essaient d'être récupéré  */
 echo '<ul>';
 foreach( $XML->status as $Status )
 {
 $datetime = date_create($Status->created_at);
 $date = date_format($datetime, $date_format)."\n";
 echo '<li>'.parse($Status->text);
 echo ' (<a href="http://twitter.com/'.$user.'/status/'.$Status->id.'">'.$date.'</a>)</li>';
 }
 echo '</ul>';
}
?>

Il est important de remarquer que le script peut être adapté, en particulier en ce qui concerne l'xHTML et le CSS.

Télécharger le script

L'ensemble des codes présentés sur cet article peuvent être téléchargé et installé facilement sur un site web qui accepte les codes en PHP 5.

Pour l'utiliser, il faut télécharger le script, le dézipper et l'envoyer sur le site web de votre choix.

L'outil de micro-blogging Twitter devient de plus en plus populaire. Grâce à l'API de ce dernier, il est possible de récupérer les derniers messages postés sur un compte Twitter. Une fois extrait, les messages (aussi appelé "tweets") peuvent être affiché sur un site web. Cet article détail la méthode pour le faire grâce à un script PHP.

Logo de Twitter

Logo de Twitter

Prérequis

Avant toutes choses, il faut savoir que le script fonctionne uniquement avec les versions de PHP supérieur à PHP 5.

Pour comprendre comment obtenir les messages d'un compte Twitter, il suffit de consulter la documentation de l'API Google et plus particulièrement la page "statuses user_timeline". Cette révèle qu'un document XML contient les informations des messages postés sur Twitter. A titre d'exemple, voici l'adresse du document XML de mon compte Twitter:

Il est possible de limiter le nombre de tweets inclus sur ce document XML. De ce fait, il est possible de limiter le nombre de message à afficher sur son site web. Pour cela, l'adresse devient:

La variable représente le nombre de messages qui seront extrait.

Présentation du script

Le script présent ci-dessous peut être personnalisé facilement:

<?php
function parse($text)
{
 $text = preg_replace('#http://[a-z0-9._/-]+#i', '<a href="$0">$0</a>', $text);
 $text = preg_replace('#@([a-z0-9_]+)#i', '@<a href="http://twitter.com/$1">$1</a>', $text);
 $text = preg_replace('# \#([a-z0-9_-]+)#i', ' #<a href="http://search.twitter.com/search?q=%23$1">$1</a>', $text);
 return $text;
}

$user = "TonyArchambeau"; /* Nom d'utilisateur sur Twitter */
$count = 8; /* Nombre de message à afficher */
$date_format = 'd M Y, H:i:s'; /* Format de la date à afficher */
$url = 'http://twitter.com/statuses/user_timeline/'.$user.'.xml?count='.$count;
$oXML = simplexml_load_file( $url );

echo '<ul>';
foreach( $oXML->status as $oStatus )
{
 $datetime = date_create($oStatus->created_at);
 $date = date_format($datetime, $date_format)."\n";
 echo '<li>'.parse(utf8_decode($oStatus->text));
 echo ' (<a href="http://twitter.com/'.$user.'/status/'.$oStatus->id.'">'.$date.'</a>)</li>';
}
echo '</ul>';
?>

Démonstration

Ce script affiche non seulement le message, mais également la date à laquelle le message à été posté et un lien vers le message.

Il est important de créer et d'utiliser la fonction "parse()" car par défaut Twitter utilise du texte brut. Aucun code HTML n'est présent. De ce fait, les liens ne sont pas cliquables.

Personnaliser

L'API Twitter possède plus d'information qui peuvent être utilisée, voici la liste des informations disponibles:

Variable Utilité Exemple
created_at Indique la date et l'heure de création du message. Tue Jan 05 13:43:11 +0000 2010
id Numéro d'identifiant du Tweet. Utile pour faire un lien vers le tweet (exemple: http://twitter.com/TonyArchambeau/status/7195965162). 7195965162
text Texte du message. [Note de Lecture] BrowseRank: Letting Web Users Vote for Page Importance: http://bit.ly/5BP3Uq
source Indique la source du message. Cela peut être un lien vers le service qui a généré le message (exemple: Twitterfeed, TweetDeck, Tweetie ...). web
truncated Indique si le message a été tronqué. La valeur est soit true ou false. false
in_reply_to_status_id Si le message est une réponse à un tweet, cette balise contient l'identifiant du tweet concerné. 7403141723
in_reply_to_user_id Si le message est une réponse à un tweet, cette balise contient l'identifiant de l'utilisateur qui a posté le premier tweet. 1940621
favorited Indique si le tweet est dans les favoris de l'utilisateur. La valeur est soit true ou false. false
in_reply_to_screen_name Si le message est une réponse à un tweet, cette balise contient le nom de l'utilisateur qui a posté le premier tweet. Matze_Jimdo
geo Localisation de l'utilisateur lorsqu'il a posté le tweet. La localisation est déterminée grâce à Georss. <georss:point>37.78029 -122.39697</georss:point>

Pour utiliser l'une ou l'autre des variables présente dans le tableau ci-dessus il suffit d'utiliser le code de cette façon: $oStatus->id (id peut être remplacé par n'importe quelle autre variable).

Démonstration

Une démonstration de ce script est disponible sur la page "Réseaux sociaux" de mon CV en ligne. Bien entendu, il est possible de personnaliser le script en modifiant le xHTML et le CSS. Cela permettant d'améliorer l'esthétique et d'intégrer plus facilement cet élément dans le design d'un site.