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 :

Remplacement des lettres accentuées dans le pattern


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 55
    Points : 49
    Points
    49
    Par défaut Remplacement des lettres accentuées dans le pattern
    Salut tout le monde !

    J'ai un soucis avec un remplacement de caractères dans le pattern d'une regex ! (j'ai rien trouvé là dessus, j'espère ne pas faire un doublon sur le forum)
    En fait j'ai une fonction qui va faire un preg_match selon les paramètres qu'on lui passe, comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function remove_item($chaine, $str_to_remove){
        preg_match("`".EMPTY_PATTERN.$str_to_remove.EMPTY_PATTERN."(.*$)`is", $chaine, $out);
        return is_array($out) && count($out)>0 ? delete_empty_tags(str_replace($out[0],'',$chaine),end($out)) : $chaine;
    }
    Explication : delete_empty_tags est une fonction à moi qui ne pose pas de problème, et la constante EMPTY_PATTERN est préalablement définie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    define('EMPTY_PATTERN','(\s*<br[^>]*>\s*|\s*<hr[^>]*>\s*|(&nbsp;)*)*');
    Exemple :
    Appel de la fonction : remove_item('blabla1 <strong> Ref </strong> blabla2', 'ref');
    Retour : 'blabla1 blabla2'
    la chaine 'ref' a été virée dans la fonction remove_item, et la balise <strong> s'est retrouvée vide, elle a été jetée dans la fonction delete_empty_tags.

    Donc ça, ça marche.
    Le truc, c'est que dans $str_to_remove je veux qu'il ne prenne pas en compte les accents. C'est là que ça commence à cafouiller*.
    Alors pour l'exemple je me concentre sur les e. J'ai fait ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function remove_item($chaine, $str_to_remove){
        $str_to_remove=preg_quote($str_to_remove);   // Au passage, on protège la chaine
        $str_to_remove=preg_replace('`[eéèêë]`is','[eéèêë]',$str_to_remove);   // Là c'est ce que j'ai fait pour remplacer les e (accentués ou non) par la chaine "[eéèêë]"
        preg_match("`".EMPTY_PATTERN.$str_to_remove.EMPTY_PATTERN."(.*$)`is", $chaine, $out);
        return is_array($out) && count($out)>0 ? delete_empty_tags(str_replace($out[0],'',$chaine),end($out)) : $chaine;
    }
    (dans le vrai code la fonction fait 2 lignes, là j'ai développé pour une meilleure compréhension, ça ne change rien)


    Voilà c'est le mieux que je peux sortir de ma tête pour le moment ^^ Mais ça marche pas
    Si je reprends mon exemple du dessus, avec cet appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    remove_item('blabla1 <strong> Ref </strong> blabla2', 'ref');
    Là c'est toujours ok.

    Mais si je mets un accent comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    remove_item('blabla1 <strong> Réf </strong> blabla2', 'ref');
    Là aucun résultat n'est trouvé avec le preg_match. Pourtant j'ai bien vérifié, la variable $str_to_remove, elle passe bien de 'ref' à 'r[eéèêë]f'.
    Alors pourquoi preg_match ne trouve rien ????

    Merci d'avance pour votre aide !


    * Je sais que le mot 'cafouiller' ne s'emploie plus depuis 1912 (environ), j'avais pensé à mettre le mot 'merder' mais ça fait vulgaire et nous sommes sur un forum sérieux ici.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par kopros2 Voir le message
    Mais si je mets un accent comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    remove_item('blabla1 <strong> Réf </strong> blabla2', 'ref');
    Là aucun résultat n'est trouvé avec le preg_match. Pourtant j'ai bien vérifié, la variable $str_to_remove, elle passe bien de 'ref' à 'r[eéèêë]f'.
    Alors pourquoi preg_match ne trouve rien ????
    Ton script php est probablement en UTF-8. Il faut ajouter l'option u à tes patterns pour forcer UTF-8 comme charset de pcre. En espérant que ta source réelle pour $chaine est aussi en UTF-8.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        $str_to_remove=preg_replace('`[eéèêë]`isu','[eéèêë]',$str_to_remove);
        preg_match("`".EMPTY_PATTERN.$str_to_remove.EMPTY_PATTERN."(.*$)`isu", $chaine, $out);

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 55
    Points : 49
    Points
    49
    Par défaut
    Merci pour ta réponse !
    Je comprends bien le principe, faut que je fasse de tests avec ça.
    Comment je peux spécifier que $chaine doit être en UTF-8 ?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par kopros2 Voir le message
    Comment je peux spécifier que $chaine doit être en UTF-8 ?
    Normalement tu devrais connaitre le charset des données: base de données, fichiers, documents générés, etc. Sinon, il a bien la fonction mb_detect_encoding() qui pourrait y arriver ou la multitude de codes suggérés dans les commentaires de cette fonction.

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/04/2008, 09h24
  2. lettre accentuée dans mysql
    Par sam01 dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 24/07/2006, 10h16
  3. SQL : remplacer des minuscules accentuées
    Par exile50 dans le forum SQL
    Réponses: 4
    Dernier message: 26/12/2005, 09h21
  4. Récupération des lettres accentuées
    Par troumad dans le forum Installation
    Réponses: 5
    Dernier message: 15/11/2005, 22h28
  5. Comment entrer des lettres accentuées sous postgresql ?
    Par Chihuahua dans le forum Requêtes
    Réponses: 11
    Dernier message: 28/08/2003, 09h04

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