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 :

Passage à l’encodage unicode impact sur les regex développées sous l’encodage latin.


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2015
    Messages : 29
    Points : 26
    Points
    26
    Par défaut Passage à l’encodage unicode impact sur les regex développées sous l’encodage latin.
    Bonjour,

    Comme expliqué dans le titre je viens de modifier l’encodage, dans son intégralité, d’un site existant. Pas mal de doc et forum sur ce topic moins sur les impacts des regex…

    J’ai bien sûre des impacts sur mes regex je voulais savoir si pour pallier ces derniers, je pouvais :

    1 ) Une solution simple sans trop d’embêtement.. !?
    J’ai pensé modifier l’encodage de mes variables pour appliquer la regex avant de remettre l’unicode du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $adresse_post = utf8_decode($_POST['adresse']);
    $pattern = '`[^A-Za-z0-9\'\-,:( )&çéèêëàâîïôùûÇÉÈÊËÀÂÎÏÔÙÛ]`i';
    If (!preg_match($pattern,$ 'adresse'_post))	{ }
    $adresse_post = utf8_encode($adresse_post)
    ;

    Ou bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    adresse_post=iconv("UTF-8","ISO-8859-1",$_POST['adresse']);
    $pattern = '`[^A-Za-z0-9\'\-,:( )&çéèêëàâîïôùûÇÉÈÊËÀÂÎÏÔÙÛ]`i';
    If (!preg_match($pattern,$adcompl_post))	{ }
    $adresse_post=iconv("ISO-8859-1","UTF-8",$adresse_post);
    Cela est-il envisageable et pourrait fonctionner ?

    2) Indépendamment de la réponse 1, existe-t-il un moyen « idéal » de modifier la regex pour qu’elle soit comprise sous l’unicode ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $pattern = '`[^A-Za-z0-9\'\-,:( )&çéèêëàâîïôùûÇÉÈÊËÀÂÎÏÔÙÛ]`i';
    If (!preg_match($pattern,$ 'adresse'_post))	{ }
    3) Enfin je ne comprends pas pourquoi ma regex fonctionne (fonctionnait donc dans l’encodage latin) qu’à l’envers seulement!? C’est-à-dire que je contrôle que ma variable ne contienne pas l’inverse des caractères listés, qui sont donc les caractères attendus… de telle sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $pattern = '`[^A-Za-z0-9\'\-,:( )&çéèêëàâîïôùûÇÉÈÊËÀÂÎÏÔÙÛ]`i';
    If (!preg_match($pattern,$ 'adresse'_post))	{ }
    Alors que je voudrais logiquement contrôler que ma variable contienne seulement les caractères listés dans ma pattern tél que : (je supprime le « ! » au preg_match, ainsi que le « ^ » à l’intérieure de ma classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $pattern = '`[A-Za-z0-9\'\-,:( )&çéèêëàâîïôùûÇÉÈÊËÀÂÎÏÔÙÛ]`i';
    If (preg_match($pattern,$ 'adresse'_post))	{ }
    Dans ce cas la pattern ne fonctionne plus… ou que sur le premier caractère.. j’ai alors essayé en ajoutant ^[…]$ ou ^[…]*$ sans succès…

    Je reste dans l’attente de votre aide, je vous remercie !

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Il faut utiliser le modifieur "u" pour l'unicode :
    http://php.net/manual/fr/reference.p....modifiers.php
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Pour ce qui est de la question 3), c'est très simple, ta pattern `[A-Za-z0-9\'\-,:( )&çéèêëàâîïôùûÇÉÈÊËÀÂÎÏÔÙÛ]`i va réussir dés lors qu'un caractère de la classe est trouvé dans la chaîne. Elle réussira par exemple avec #!?@]a puisque le a vérifie bien la pattern.

    Or toi ce que tu veux c'est vérifier la chaîne du début à la fin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pattern = '`\A[A-Za-z0-9\'\-,:( )&çéèêëàâîïôùûÇÉÈÊËÀÂÎÏÔÙÛ]+\z`';
    Il faut donc utiliser les ancres de début et fin de chaîne (\A et \z) et un quantificateur (ici + mais on peut aussi utiliser * pour autoriser la chaîne vide).

    Il n'est pas utile de mettre le modificateur i si tu précises dans la classe tous les caractères dans les deux casses.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

Discussions similaires

  1. Cherche prof particulier cours sur les regex à Paris
    Par zegilooo dans le forum Demandes
    Réponses: 0
    Dernier message: 23/10/2007, 14h14
  2. Question sur les Regex. interdire une chaine
    Par cysboy dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/05/2007, 13h49
  3. Question sur les regex, besoin d'une lumière
    Par Cladjidane dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 09/03/2007, 12h28
  4. Aide sur les regex
    Par etranger dans le forum Langage
    Réponses: 12
    Dernier message: 30/08/2006, 22h32

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