IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Utilisation de str_replace pour créer des permaliens


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 90
    Points : 36
    Points
    36
    Par défaut Utilisation de str_replace pour créer des permaliens
    Bonjour tout le monde !

    J'aurais besoin d'aide pour l'utilisation de str_replace !

    En effet, j'aimerais ajouter sur mon site un système de permaliens. Pour ceux qui ne comprendraient pas mon souhait, le permalien permet de mettre en avant des mots clés dans la barre d'adresse. Exemple: [url/]http://www.monsite.fr/tests.php?titre=coupe-monde-fifa-10-ps3[/url] (pour éviter la création du lien )

    Je veux le faire de manière dynamique, lorsque j'envoie mon formulaire, je voudrais assembler deux variables, les concaténer puis les formater pour avoir quelque chose du genre nom-du-jeu-console. La fonction str_replace me semblait la plus utile pour ça. Voilà comment je pourrais utiliser cette fonction d'un point de vue personnel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function format_permalien($texte) {
    $permalien = str_replace(', -, $texte);
    $permalien = str_replace('s, -, $texte);
    $permalien = str_replace("espace", -, $texte);
    ...
    echo $permalien;
    return
    }
    En gros, je voudrais remplacer les espaces et d'autres éléments par un tiret. Est-ce que j'utilise la fonction de la bonne manière ?

    J'aurais vraiment besoin de vos conseils ! Merci d'avance !

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur LAMP
    Inscrit en
    Janvier 2010
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur LAMP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2010
    Messages : 48
    Points : 72
    Points
    72
    Par défaut
    Pour éviter les ennuis remplace tous ce qui n'est pas alphanumérique par des tirets.

    Donc quelques choses de ce genre là
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function permalien($texte) 
    {
        $pattern   = '/[^a-z0-9]/i'; 
        $permalien = preg_replace($pattern, '-', $texte);
        return $permalien;
    }
    Un conseil évite de laisser passer des accents ou autre chose qui pourrai porter préjudice à ton référencement.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 90
    Points : 36
    Points
    36
    Par défaut
    Merci pour ta réponse !

    Donc il faut utiliser les REGEX à ce que j'ai compris. Il va falloir que je m'y mette alors, ah ben mince ^^

    J'essaie alors de faire en sorte de supprimer les mots de moins de 3 lettres. J'ai trouvé cette expression : -(.{1,2}-)+|^(.{1,2}-)+|(-.{1,2})+$

    Je ne connais pas les REGEX donc je ne sais pas si ça peut marcher, néanmoins j'ai essayé le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    $texte = "Je t'aime ma chiwoui";
    $pattern = '/[^a-z0-9]/i'; 
    $pattern2 = '-(.{1,2}-)+|^(.{1,2}-)+|(-.{1,2})+$';
    $permalien = preg_replace($pattern, '-', $texte );
    $permalien = preg_replace($pattern2,'',$texte);
    echo $permalien;
    ?>
    J'ai le droit à ce message d'erreur:

    Warning: preg_replace() [function.preg-replace]: Unknown modifier ')' in C:\wamp\www\index.php on line 6

    Merci d'avance pour ceux qui pourront m'aider !

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur LAMP
    Inscrit en
    Janvier 2010
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur LAMP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2010
    Messages : 48
    Points : 72
    Points
    72
    Par défaut
    Il faut utiliser des délimiteurs dans tes patterns.


    Du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $pattern = "#[a-z]#"; // Le délimiteur ici est le #
     
    ou 
     
    $pattern = "/[a-z]/"; // Le délimiteur ici est le /

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 90
    Points : 36
    Points
    36
    Par défaut
    J'ai vu ça après pendant que je testais de mon côté.

    Alors j'ai utiliser ce code là et ça marche impec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    $texte = "Coupe du monde de la Fifa 2010";
    $pattern = '/[^a-z0-9]/i'; 
    $pattern2 = '#-(.{1,2}-)+|^(.{1,2}-)+|(-.{1,2})+$#';
    $texte = preg_replace($pattern, '-', $texte );
    $texte = preg_replace($pattern2,'-',$texte);
    echo $texte;
    ?>
    Ca me donne comme réponse : Coupe-monde-Fifa-2010

    Maintenant faut que je trouve le moyen de remplacer les accents par les lettres sans accent (que je vais faire par array je suppose) et aussi forcer la chaine de caractères à se mettre en minuscule ^^

    Je vais voir si je trouve, si quelqu'un peut m'aider pour ça pour me faire gagner du temps, je suis preneur ^^

    Merci DevArt !

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur LAMP
    Inscrit en
    Janvier 2010
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur LAMP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2010
    Messages : 48
    Points : 72
    Points
    72
    Par défaut
    Pour les accents cherche une fonction qui remplacera le caractère accentué par son équivalent sans accent, que tu appelleras en première dans ta fonction format_permalien(). Sinon tous tes accents seront remplacés par des tirets.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    function format_permalien($texte) 
    {
     
    $permalien = sans_accent($texte); // Suppression des accents
     
    $pattern = '/[^a-z0-9]/i'; 
    $permalien = preg_replace($pattern, '-', $permalien ); // Remplace les caractères non alphanumérique par des tirets.
     
    /*
    Autre problème si tu as cette chaine =>
     
    $chaine = "Jean - Paul";
     
    Elle sera retourné => jean---Paul
     
    Donc tu peux si tu le souhaite
    */
     
    $pattern = '/-{2,}/'; // J'ai un doute ici
    $permalien = preg_replace($pattern, '-', $permalien ); // Remplace plusieurs tirets consécutifs par un seul
     
    return strtolower($permalien);
    }
     
    function sans_accent($texte)
    {
       $string = strtr($texte,
       "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ",
       "aaaaaaaaaaaaooooooooooooeeeeeeeecciiiiiiiiuuuuuuuuynn");
     
         return $string;
     
    }

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 90
    Points : 36
    Points
    36
    Par défaut
    Voilà pour le moment mon code qui marche à merveille (et ce, même avec des mots accentués ^^) et commenté pour les intéressés:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <?php
    //Création de la variable de texte
    $texte = "Coûpé du möndè de la Fîfà 2010";
     
    //On crée une variable qui sélectionne tout ce qui n'est pas alphanumérique
    $pattern = '/[^a-z0-9]/i'; 
     
    //On crée une variable qui fait la sélection de tous les mots inférieurs à 3 lettres
    $pattern2 = '#-(.{1,2}-)+|^(.{1,2}-)+|(-.{1,2})+$#';
     
    //On commence le premier formatage de texte pour remplacer les accents
    $texte = strtr($texte, 'àáâãäåòóôõöøèéêëçìíîïùúûüÿñ', 'aaaaaaooooooeeeeciiiiuuuuyn'); 
     
    //Deuxième formatage qui remplace tous les éléments qui sont normalement alphanumériques par des tirets
    $texte = preg_replace($pattern, '-', $texte );
     
    //Troisième formatage qui remplace tous les mots ayant moins de 3 lettres par rien ^^
    $texte = preg_replace($pattern2,'-',$texte);
     
    //Dernier formatage et affichage du texte en minuscules
    echo strtolower($texte);
    ?>
    Après DevArt, je ne sais pas si j'aurais un problème avec plusieurs tirets mais je vais observer ton code pour le "au cas où". Merci de ton aide et si tu as des choses à me faire corriger dans mon code, je suis preneur (outre la possibilité d'erreur de plusieurs tirets consécutifs).

    Merci !

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 90
    Points : 36
    Points
    36
    Par défaut
    DevArt, ton morceau pour le nombre de tirets est nickel ! Voici mon code final:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    <?php
    //Création de la variable de texte
    $texte = "Coûpé --- du möndè de la Fîfà 2010";
     
    //On crée une variable qui sélectionne tout ce qui n'est pas alphanumérique
    $pattern = '/[^a-z0-9]/i'; 
     
    //On crée une variable qui fait la sélection de tous les mots inférieurs à 3 lettres
    $pattern2 = '#-(.{1,2}-)+|^(.{1,2}-)+|(-.{1,2})+$#';
     
    //On fait attention au cas où il y aurait plusieurs tirets consécutifs
    $pattern3 = '/-{2,}/'; // J'ai un doute ici
     
    //On commence le premier formatage de texte pour remplacer les accents
    $texte = strtr($texte, 'ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ', 'aaaaaaaaaaaaooooooooooooeeeeeeeecciiiiiiiiuuuuuuuuynn'); 
     
    //Deuxième formatage qui remplace tous les éléments qui sont normalement alphanumériques par des tirets
    $texte = preg_replace($pattern, '-', $texte );
     
    //Troisième formatage qui remplace tous les mots ayant moins de 3 lettres par rien ^^
    $texte = preg_replace($pattern2,'-',$texte);
     
    //Quatrième formatage qui remplace plusieurs tirets à la suite par un seul tiret
    $texte = preg_replace($pattern3, '-', $texte );
     
    //Dernier formatage et affichage du texte en minuscules
    echo strtolower($texte);
    ?>
    Merci ! Merci ! Merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 16
    Dernier message: 05/01/2016, 10h29
  2. Utiliser un tableau pour créer des series
    Par Nymar dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/09/2014, 12h04
  3. Quels langages utiliser pour créer des sites web
    Par 3abdelmalek dans le forum Débuter
    Réponses: 5
    Dernier message: 05/02/2010, 12h05
  4. Réponses: 4
    Dernier message: 19/10/2008, 20h07
  5. Réponses: 5
    Dernier message: 06/09/2006, 13h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo