URL & Résilience

Après trois changements d'algorithme de création d'URL pour les articles de mon blog, il fallait bien que ça arrive : il y a plein de liens erronés qui trainent maintenant sur internet et donc dans Google, ce qui est assez nul en terme de référencement, ainsi que pour le chaland qui tombe sur une page toute nulle, avec pour contenu un peu encourageant « Article inconnu ».

Alors oui, c'est triste et c'est con, mais impossible de renoncer à la forme actuelle de mes URL : une URL comme pour de vrai, sans numéro d'identification.

Après avoir réfléchi très fort (aïe), j'ai trouvé une solution pas trop mal, même si elle peut être couteuse en terme de performance à cause de l'algorithme choisi. Mais enfin, mon CMS est super malin alors c'est pas très grave :-)

L'idée

C'est arrivé avec le morceau d'URL supprimer_les_accents_des_caracteres_accentues_en_php.html, qui est maintenant supprimer-les-accents-des-caracteres-accentues-php.html. Les séparateurs ne sont plus les mêmes et les mots qui font moins de trois caractères sont maintenant supprimés (les nombres n'étant pas affectés).

Je me suis dit : « c'est dommage, c'est presque les mêmes » et paf j'ai pensé aux fonctions similar_text() et levenshtein() de PHP qui permettent de calculer selon la fonction, les similitudes ou les différences entre deux chaines de caractères.

J'ai choisi d'utiliser la fonction similar_text(), même si la documentation dit que sa copine est plus rapide, les résultats de similar_text() sont vraiment stupéfiant (j'en rajoute -à peine- pour le suspense).

Le code

Voici le morceau de code qui me sauve la mise.

Si vous voulez l'utiliser il faudra l'adapter un bout parce que les fonctions liées à la base de donnée sont celles de mon CMS, mais sinon en gros ça devrait le faire.

<?php

#
# fetch the title and the id of all the articles
#

$entries = $module->select(array(self::ID, self::TITLE));

if (empty($entries))
{
    return l('There is no article in the database');
}

#
# normalize the title we are looking for, 
# discarding words smaller than 4 characters, while preserving
# numbers
#

$title = wd_normalize($url_title);
$title = wd_discard_substr_by_length($title4);

#
# the closest we are to the title, the smallest the return value of 
# levenshtein() is, thus we have to start with a big score
#

$max = 0;

foreach ($entries as $entry)
{
    #
    # normalize the title to compare, the same way we did
    # for the title to find
    #

    $compare = wd_normalize($entry[self::TITLE]);
    $compare = wd_discard_substr_by_length($compare4);
    
    #
    # compare string
    #
    
    similar_text($title$compare$p);
    
    #
    # log result
    #
    
    printf('"%s" ?= [id:%02d] "%s" == %.2f%%<br />'$title$entry[self::ID]$compare$p);

    if ($p > $max)
    {
        #
        # we have found a better match, we save its id
        #
    
        $id = $entry[self::ID];
                                
        if ($p > 90)
        {
            #
            # huge match, we can break the loop
            #

            break;
        }
        
        $max = $p;
    }
}

Le résultat

Bon, j'ai un peu compliqué la mauvaise URL en utilisant supmer_les_acents_en_php.html pour voir l'efficacité du machin, mais voilà ce que ça donne :

"supmer-acents" ?= [id:01] "naissance-application" == 35.29%
"supmer-acents" ?= [id:02] "3-indispensables-pour-developpeur" == 21.74%
"supmer-acents" ?= [id:03] "30" == 0.00%
"supmer-acents" ?= [id:04] "guide-graphiste-independant" == 25.00%
"supmer-acents" ?= [id:05] "result-type-should-either" == 26.32%
"supmer-acents" ?= [id:06] "vide" == 11.76%
"supmer-acents" ?= [id:07] "portrait-aurore" == 35.71%
"supmer-acents" ?= [id:08] "markdown-textile-textmark" == 15.79%
"supmer-acents" ?= [id:09] "creer-nuage-mots" == 48.28%
"supmer-acents" ?= [id:10] "comment-creer-logo-wdblog" == 21.05%
"supmer-acents" ?= [id:11] "support-mise-valeur-code-html" == 47.62%
"supmer-acents" ?= [id:12] "formater-dates-avec-legerete" == 39.02%
"supmer-acents" ?= [id:13] "initiation-variables" == 6.06%
"supmer-acents" ?= [id:14] "marqueurs-controle" == 32.26%
"supmer-acents" ?= [id:15] "supprimer-accents-caracteres-accentues" == 50.98%
"supmer-acents" ?= [id:16] "trier-cles-accentuees-tableau-associatif" == 33.96%
"supmer-acents" ?= [id:17] "bloc-pagination-classe" == 11.43%
"supmer-acents" ?= [id:18] "vilains-guillemets-magiques" == 30.00%
"supmer-acents" ?= [id:19] "anti-spam-fastoche" == 25.81%
"supmer-acents" ?= [id:21] "previsions-meteo" == 27.59%
"supmer-acents" ?= [id:22] "dessiner-damier-photoshop" == 42.11%
"supmer-acents" ?= [id:23] "classe-cinq-methodes-pour-creer-miniatures" == 29.09%

50.98% de ressemblance c'est pas le pied mais ça suffit, surtout avec une URL aussi abimée et vilaine.

Chouette !

Laisser un commentaire

Pas de commentaire