Fonction nofollow

Attention, depuis PHP 5.5.0, certaines extensions SQL sans doute utilisées dans ce tutoriel peuvent être obsolètes et seront supprimées dans le futur, vous devez donc adapter les codes! Exemples ici.
"nofollow" permet d'indiquer que le lien qui comporte cet attribut ne doit pas être pris en compte par un robot lisant la page et ceci afin de ne pas augmenter le rang dans les moteurs de recherche du site internet vers lequel pointe le lien. Cet attribut permet théoriquement de décourager les spammeur.
 
La fonction nofollow que je vous proposes ici permet de remplacer tout les liens d'une variable sauf exception en y placent l'attribut nofollow (rel="nofollow").
<?php
function nofollow($message){
    //Motif à trouver
    $motif='#href="(.*?)"#is';
    //Expression rationnelle globale
    preg_match_all($motif,$message,$sortie,PREG_PATTERN_ORDER);
    //Boucle sur les élément trouvé
    foreach ($sortie[1] as $url) {
    //Parse chaque url pour trouver son "host"
    $lien = parse_url($url);
    //Simple condition pour comparer les url
    if(isset($lien['host']) && $lien['host']!="creer-un-site.fr"){
    //On met le(s) lien(s) indésirables en nofollow
    $message=str_replace('href="'.$url.'"','rel="nofollow" href="'.$url.'"',$message);
        }
    }
    return $message;
}
 
$source = '<a title="créer un site web" href="http://creer-un-site.fr">Créer un site internet</a><br/> <a title="créer un site internet" href="http://www.creer-un-site.fr">Créer un site web</a><br/> <a title="Google.fr" href="http://google.fr">Google.fr</a><br/> <a title="Google.com" href="http://google.com">Google.com</a><br/> <a title="CMS spécial free.fr" href="/categorie-12-cms-special-free.php">CMS spécial free.fr</a> ';
//Affiche le résultat
echo nofollow($source);
?>
Décortiquons un peut la bête...
$motif='#href="(.*?)"#is';
Expression régulière ou masque permettant de trouver les liens dans la variable.
preg_match_all($motif,$message,$sortie,PREG_PATTERN_ORDER);
On demande à trouver le masque $motif dans la variable $message et de sortir le résultat dans la variable $sortie qui est un tableau qui contient les résultats qui satisfont la première parenthèse capturante.
 
Si on effectue un print_r() de $sortie
echo '<pre>';
 print_r($sortie);
echo '</pre>';
...on obtient le tableau suivant :
Array
(
    [0] => Array
        (
            [0] => href="http://creer-un-site.fr"
            [1] => href="http://www.creer-un-site.fr"
            [2] => href="http://google.fr"
            [3] => href="http://google.com"
            [4] => href="/categorie-12-cms-special-free.php"
        )
 
    [1] => Array
        (
            [0] => http://creer-un-site.fr
            [1] => http://www.creer-un-site.fr
            [2] => http://google.fr
            [3] => http://google.com
            [4] => /categorie-12-cms-special-free.php
        )
 
)
Ce qui nous intéresse se trouve dans la seconde partie du tableau [1] qui correspond donc à $sortie[1]. Comme on souhaite obtenir les liens séparément, on utilise une boucle for :
foreach ($sortie[1] as $url) {
 
}
Maintenant, on va chercher uniquement le nom de domaine contenu dans chaque lien et pour réaliser cela, on parse chaque url :
$lien = parse_url($url);
Si on effectue un print_r() de la variable $lien :
echo '<pre>';
print_r($lien);
echo '</pre>';
...on obtient le résultat suivant :
Array
(     [scheme] => http            [host] => creer-un-site.fr  )    
Array
(
    [scheme] => http
    [host] => www.creer-un-site.fr
)
 
 
Array
(     [scheme] => http       [host] => google.fr )    
Array
(
    [scheme] => http
    [host] => google.com
)
 
 
Array
(
    [path] => /categorie-12-cms-special-free.php
)
Ce tableau renvoie donc le [host] qui correspond au nom de domaine de chaque url. On va donc utiliser la variable $lien['host'] pour réaliser une condition et transformer toute les url indésirable en nofollow :
if(isset($lien['host']) && $lien['host']!="creer-un-site.fr"){
 //On met le(s) lien(s) indésirables en nofollow
 $message=str_replace('href="'.$url.'"','rel="nofollow" href="'.$url.'"',$message);
}
Pour afficher le tout, on fait un simple appel à la fonction nofollow() en passant en paramètre la variable concerné. Dans cet exemple il sagit de la variable $source :
echo nofollow($source);
Le résultat final donne donc :
<a title="créer un site web" href="http://creer-un-site.fr">Créer un site internet</a><br/>
<a title="créer un site internet" rel="nofollow" href="http://www.creer-un-site.fr">Créer un site web</a><br/>
<a title="Google.fr" rel="nofollow" href="http://google.fr">Google.fr</a><br/>
<a title="Google.com" rel="nofollow" href="http://google.com">Google.com</a><br/>
<a title="CMS spécial free.fr" href="/categorie-12-cms-special-free.php">CMS spécial free.fr</a>
Voir/déposer un commentaire (0) | Signaler un problème