[Script PHP] Fonctions pour créer un slug (SEO friendly URL)

Consultez la formation au référencement naturel Google de WebRankInfo / Ranking Metrics


spout
WRInaute accro
WRInaute accro
 
Messages: 1320
Inscription: Mer Mai 14, 2003 11:05

[Script PHP] Fonctions pour créer un slug (SEO friendly URL)

Message le Dim Sep 14, 2008 12:25

Bonjour,

J'aimerais savoir ce que vous utilisez comme fonction dite de "slug": pour transformer un titre en URL.

Voici la fonction que j'utilise:
Code: Tout sélectionner
function slug($slug){
   $bad = array( 'Š','Ž','‘','ž','Ÿ','À','Á','Â','Ã','Ä','Å','Ç','È','É','Ê','Ë','Ì','Í','Î','Ï','Ñ',
   'Ò','Ó','Ô','Õ','Ö','Ø','Ù','Ú','Û','Ü','Ý','à','á','â','ã','ä','å','ç','è','é','ê',
   'ë','ì','í','î','ï','ñ','ò','ó','ô','õ','ö','ø','ù','ú','û','ü','ý','ÿ',
   'Þ','þ','Ð','ð','ß','Œ','œ','Æ','æ','µ',
   '”',"'",'“','"',"\n","\r",'_','&',':','/');
   
   $good = array( 'S','Z','s','z','Y','A','A','A','A','A','A','C','E','E','E','E','I','I','I','I','N',
   'O','O','O','O','O','O','U','U','U','U','Y','a','a','a','a','a','a','c','e','e','e',
   'e','i','i','i','i','n','o','o','o','o','o','o','u','u','u','u','y','y',
   'TH','th','DH','dh','ss','OE','oe','AE','ae','u',
   '','-','','','','','-','','','');
   
   // replace strange characters with alphanumeric equivalents
   $slug = str_replace( $bad, $good, $slug );
   
   $slug = trim($slug);
   
   // remove any duplicate whitespace, and ensure all characters are alphanumeric
   $bad_reg = array('/\s+/','/[^A-Za-z0-9\-]/');
   $good_reg = array('-','');
   $slug = preg_replace($bad_reg, $good_reg, $slug);
   
   // and lowercase
   $slug = strtolower($slug);
   
   return $slug;
}

Mais ce la ne fonctionne pas bien pour des titres style:
- mon,super,titre (cela donne: monsupertitre, je voudrais: mon-super-titre)
- super...formidable (cela donne: superformidable)

Je me tourne vers vous afin de peut-être trouver une meilleure fonction.


athoms
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 243
Inscription: Jeu Avr 22, 2004 2:04

Message le Dim Sep 14, 2008 13:35

Bonjour,

Un simple urlencode ne suffit pas?
$titre=urlencode($titre)


Bool
WRInaute accro
WRInaute accro
 
Messages: 1290
Inscription: Jeu Fév 26, 2004 15:59

Message le Dim Sep 14, 2008 13:45

Hello,

moi j'utilise ça depuis des années :
Code: Tout sélectionner
    static public function rewrite( $chaine )
    {
        // remplace les caractères accentués par leur version non accentuée
        $id = strtr( $chaine,
                'ŠŽšžŸÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÑÒÓÔÕÖØÙÚÛÜÝàáâãäåçèéêëìíîïñòóôõöøùúûüýÿ',
                'SZszYAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy' );

        // remplace les caractères non standards
        $id = preg_replace(
                array(
                    '`^[^A-Za-z0-9]+`',
                    '`[^A-Za-z0-9]+$`',
                    '`[^A-Za-z0-9]+`' ),
                array('','','-'),
                $id );

        return $id;
    }


Le soucis étant que la première chaine est encodée en "windows cp1252" ; si bien que ce code est difficilement modifiable sous une autre plateforme...

Sinon :
- mon,super,titre donne mon-super-titre
- super....formidable donne super-formidable
- "super titre !" donne super-titre

darkjukka
WRInaute passionné
WRInaute passionné
 
Messages: 612
Inscription: Sam Avr 28, 2007 12:34

Message le Dim Sep 14, 2008 14:14

Code: Tout sélectionner
function format_url( $url, $type = '' ) {
    $url = preg_replace("`\[.*\]`U","",$url);
    $url = preg_replace('`&(amp;)?#?[a-z0-9]+;`i','-',$url);
    $url = htmlentities($url, ENT_NOQUOTES, 'ISO-8859-1');
    $url = preg_replace( "`&([a-z])(acute|uml|circ|grave|ring|cedil|slash|tilde|caron|lig);`i","\\1", $url );
    $url = preg_replace( array("`[^a-z0-9]`i","`[-]+`") , "-", $url);
    $url = ( $url == "" ) ? $type : strtolower(trim($url, '-'));
    return $url;
}


La meilleure que j'ai trouvé :)


rudddy
WRInaute accro
WRInaute accro
 
Messages: 1744
Inscription: Mer Aoû 01, 2007 19:00

Message le Dim Sep 14, 2008 17:07

c'est bien beau tout cela, mais qui va trancher ???

ca m'intéresse te je sais pas laquelle choisir ...

darkjukka
WRInaute passionné
WRInaute passionné
 
Messages: 612
Inscription: Sam Avr 28, 2007 12:34

Message le Dim Sep 14, 2008 17:16

Celle où tu sens le meilleur feeling ? ^^

Au début j'en avais une autre différente dans le genre de la première postée mais je ne la trouvais vraiment pas "propre" (va savoir pourquoi). Puis je suis tombé sur celle-ci et elle m'a plus en m'offrant des choses encore mieux que l'autre (les - au lieu des _, la suppression des espace a la fin du titre quand y'avait " !") donc je l'ai adopté et puis le fait que ce soit celle utilisée par phpbbSEO pour ses mods de rewrite, cela m'a donné confiance.

KMAMa2f
Nouveau WRInaute
 
Messages: 29
Inscription: Mer Juin 07, 2006 17:37

Message le Dim Sep 14, 2008 17:50

Bonjour,

Voici se que je me suis codé

Code: Tout sélectionner
function StringClean($Str){
   
   $Str = strtolower($Str);
   $Str = strtr($Str, 'àáâãäåòóôõöøèéêëçìíîïùúûüÿñ', 'aaaaaaooooooeeeeciiiiuuuuyn');

   # Ponctuation
   $Stop[] = '(';
   $Stop[] = ')';
   $Stop[] = '[';
   $Stop[] = ']';
   $Stop[] = '{';
   $Stop[] = '}';
   $Stop[] = '&';
   $Stop[] = '.';
   $Stop[] = ';';
   $Stop[] = ':';
   $Stop[] = ',';
   $Stop[] = '!';
   $Stop[] = '?';
   $Stop[] = '<';
   $Stop[] = '>';
   
   # Math
   $Stop[] = '+';
   $Stop[] = '-';
   $Stop[] = '*';
   $Stop[] = '/';
   $Stop[] = '°';
   $Stop[] = '%';
   $Stop[] = 'µ';
   $Stop[] = '§';
   
   # Diver
   $Stop[] = '_';
   $Stop[] = '#';
   $Stop[] = '~';
   $Stop[] = '|';
   $Stop[] = '^';
   $Stop[] = '@';
   $Stop[] = '¨';
   $Stop[] = '$';
   $Stop[] = '€';
   $Stop[] = '£';

   $Str = str_replace($Stop, ' ', $Str);

   # Remplacement espace multiple
   return ereg_replace(' +', '-', trim($Str));
}


rudddy
WRInaute accro
WRInaute accro
 
Messages: 1744
Inscription: Mer Aoû 01, 2007 19:00

Message le Dim Sep 14, 2008 18:31

quand même je vous donne ma fonction :

Code: Tout sélectionner
//////////////////////////////////////////////////
// CREER LE LIEN POUR URL REWRITING //
/////////////////////////////////////////////////

function replace_char($theString){                              
   $theString = stripslashes(strtolower($theString));            
   
// Remplacement des a accentues.                           
   $a_accent  = "[&agrave;|&acirc;|&Agrave;|&Acirc;";               
   $a_accent .= "|À|Á|Â|Ã|Ä|Å|Æ|à|á|â|ã|ä|å|æ]";                  
   $theString = preg_replace($a_accent,"a",$theString);            
   
//remplacement des cedilles                                 
   $c_cedille = "[&ccedil;|&Ccedil;|ç]";                        
   $theString = preg_replace($c_cedille,"c",$theString);            
   
//remplacement des e accentues                              
   $e_accent  = "[&eacute;|&egrave;|&euml;|&ecirc;|&Eacute;|&Egrave;|";
   $e_accent .= "&Euml;|&Ecirc;|È|Ê|Ë|É|è|é|ê|ë]";                  
   $theString = preg_replace($e_accent,"e",$theString);            
   
//remplacement des i accentues                              
   $i_accent = "[&iuml;|&icirc;|&Iuml;|&Icirc;|Ì|Í|Î|Ï|ì|í|î|ï]";      
   $theString = preg_replace($i_accent,"i",$theString);            
   
//remplacement des o accentues                              
   $o_accent = "[&ocirc;|&Ocirc;|Ò|Ó|Ô|Õ|Ö|ö|õ|ô|ó|ò|ð|Ø|ø]";         
   $theString = preg_replace($o_accent,"o",$theString);            
   
//remplacement des u accentues                              
   $u_accent =  "[&ugrave;|&ucirc;|&Ugrave;|&Ucirc;|Ù|Ú|Û|Ü|ü|û|ú|ù]";   
   $theString = preg_replace($u_accent,"u",$theString);            
   
//remplacement des espaces                                 
   $any_space = "[ |/]";                                    
   $theString = preg_replace($any_space,"-",$theString);            
   
//remplacement des quote                                 
   $any_quote = "[\?|'|\"]";                                 
   $theString = preg_replace($any_quote,"-",$theString);            
   /
/remplacement des paranthèses                                 
   $any_quote = "[\(|\)]";                                 
   $theString = preg_replace($any_quote,"-",$theString);
   
//remplacement des plus                                 
   $any_quote = "[\+]";                                 
   $theString = preg_replace($any_quote,"-",$theString);
            
//remplacement des double tirets
   $any_quote = "[-----|----|---|--]";                                 
   $theString = preg_replace($any_quote,"-",$theString);

   return ($theString);                                    
}


enfin je suis conscient que c'est pas optimisé du tout ... car ça ne gère pas du tout les caractères spéciaux


rudddy
WRInaute accro
WRInaute accro
 
Messages: 1744
Inscription: Mer Aoû 01, 2007 19:00

Message le Dim Sep 14, 2008 18:39

darkjukka a écrit:Celle où tu sens le meilleur feeling ? ^^

Au début j'en avais une autre différente dans le genre de la première postée mais je ne la trouvais vraiment pas "propre" (va savoir pourquoi). Puis je suis tombé sur celle-ci et elle m'a plus en m'offrant des choses encore mieux que l'autre (les - au lieu des _, la suppression des espace a la fin du titre quand y'avait " !") donc je l'ai adopté et puis le fait que ce soit celle utilisée par phpbbSEO pour ses mods de rewrite, cela m'a donné confiance.


salut,

juste une question : est-ce que ta méthode gère les caractères spéciaux suivants (ou autres) :

# Math
$Stop[] = '+';
$Stop[] = '-';
$Stop[] = '*';
$Stop[] = '/';
$Stop[] = '°';
$Stop[] = '%';
$Stop[] = 'µ';
$Stop[] = '§';

# Diver
$Stop[] = '_';
$Stop[] = '#';
$Stop[] = '~';
$Stop[] = '|';
$Stop[] = '^';
$Stop[] = '@';
$Stop[] = '¨';
$Stop[] = '$';
$Stop[] = '€';
$Stop[] = '£';

???

darkjukka
WRInaute passionné
WRInaute passionné
 
Messages: 612
Inscription: Sam Avr 28, 2007 12:34

Message le Dim Sep 14, 2008 20:02

La chaine :
Code: Tout sélectionner
+-*/°%µ§_#~|^@¨$€£
me retourne
Code: Tout sélectionner
deg-micro-sect-uml-pound


Mais honnêtement, tu pense avoir ce genre de caractères dans un titre ou une url ?


spout
WRInaute accro
WRInaute accro
 
Messages: 1320
Inscription: Mer Mai 14, 2003 11:05

Message le Dim Sep 14, 2008 20:04

J'ai fais des test sur une cinquantaine de titres de ma BDD (petites annonces)

Je viens de tester la fonction de darkjukka, c'est la plus courte :D

Mais un titre comme celui ci:
Informatique & Internet
deviens:
informatique-amp-internet

Avec la fonction de rudddy une phrase qui termine par ")" contient un tiret en trop à la fin.

Au final je teste la fonction de Bool, et c'est celle qui à l'air de mieux fonctionner. (je rajouterais juste un strtolower() en plus)


rudddy
WRInaute accro
WRInaute accro
 
Messages: 1744
Inscription: Mer Aoû 01, 2007 19:00

Message le Dim Sep 14, 2008 20:06

darkjukka a écrit:Mais honnêtement, tu pense avoir ce genre de caractères dans un titre ou une url ?


oui : par exemple :

100% des gagnants on tenté leur chance !


spout
WRInaute accro
WRInaute accro
 
Messages: 1320
Inscription: Mer Mai 14, 2003 11:05

Message le Dim Sep 14, 2008 20:07

darkjukka a écrit:Mais honnêtement, tu pense avoir ce genre de caractères dans un titre ou une url ?


Avec le "&" ça risque d'être plus fréquent


rudddy
WRInaute accro
WRInaute accro
 
Messages: 1744
Inscription: Mer Aoû 01, 2007 19:00

Message le Dim Sep 14, 2008 20:08

spout a écrit:J'ai fais des test sur une cinquantaine de titres de ma BDD (petites annonces)

Je viens de tester la fonction de darkjukka, c'est la plus courte :D

Mais un titre comme celui ci:
Informatique & Internet
deviens:
informatique-amp-internet


pourquoi ne pas modifier si le seul problème est le & ???

spout a écrit:Avec la fonction de rudddy une phrase qui termine par ")" contient un tiret en trop à la fin.


exact c'est un de mes soucis principaux : comment y remédier ?

spout a écrit:Au final je teste la fonction de Bool, et c'est celle qui à l'air de mieux fonctionner. (je rajouterais juste un strtolower() en plus)


donc le vainqueur est ?


spout
WRInaute accro
WRInaute accro
 
Messages: 1320
Inscription: Mer Mai 14, 2003 11:05

Message le Dim Sep 14, 2008 20:20

tant que maintenant: Bool

[Script PHP] Fonctions pour créer un slug (SEO friendly URL)

Formation recommandée sur ce thème :

Formation Référencement naturel Google : apprenez une méthode efficace pour optimiser à fond le référencement naturel dans Google de façon durable... Formation animée par Olivier Duffez et Fabien Facériès, experts en référencement naturel.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité