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 :

Dr Watson et preg_match_all [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Inscrit en
    Mai 2007
    Messages
    183
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 183
    Points : 121
    Points
    121
    Par défaut Dr Watson et preg_match_all
    Bug concernant le traitement des expressions rationnelles par preg_match_all().
    pour info :je suis PHP Version 5.2.2 sous XP sp2.

    Je code des fonctions qui extraient des positions GPS dans différents formats.
    Entre autre, je repère des séquences du genre "chaine entre 2 expressions rationnelles".

    Lors de mes tests je suis tombé sur un cas "Dr Watson" (plantage php.exe).
    J'ai réduit au plus simple le code pour essayer de trouver ce qui gène notre Docteur préféré (Dans le code complet les recherches sont plus complexes) qui s'énerve avec un :

    "L'application, C:\wamp\php\php.exe, a généré une erreur d'application
    L'erreur s'est produite le 05/21/2007 à 22:31:50.312 L'exception générée
    était c0000005 à l'adresse 10154DB8 (php5ts!php_pcre_get_substring_list)"

    En activant-désactivant les commentaires je me suis aperçu que si j'active seulement $position_string='W -3°' , j'ai le plantage violent, alors que si j'active en même temps l'une des lignes au dessus, j'ai un "seulement" un petit :

    "Warning: preg_match_all(): Get subpatterns list failed in ..etc"

    Voici le tout petit bout de code qui :

    <?php

    $position_string='W nimportekoi S';// trouve : W nimportekoi S
    $position_string='Wn importeko iS';// trouve rien (sans planter)
    $position_string='W -3°';// plantage Dr Watson

    $pattern = '`(?i:[E|W]+\p{^L}+.+\p{^L}+[N|S])`';
    preg_match_all($pattern, $position_string, $matches);

    print_r ($matches[0]);

    ?>


    "L'homme est un bug ambulant, et l'ordinateur son meilleur moyen d'expression."

  2. #2
    Membre habitué Avatar de daniel61
    Inscrit en
    Décembre 2006
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 139
    Points : 169
    Points
    169
    Par défaut
    tu es certain que les données des positions GPS sont en UTF8?

    Citation Envoyé par gomodo
    Warning: preg_match_all(): Get subpatterns list failed in ..etc
    il me semble que c'est un caractère sur 8bits non encoder en UTF8 dans la chaine source qui génère cette erreur sur une regex UTF8. si tu arrive à suivre mes yeux, ils regardent ° qui est un caractère sur 8bits dans ISO-8859-1.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $matches=array();
    preg_match_all('`(?i:[EW]+\p{^L}+.+\p{^L}+[NS])`', utf8_encode('W -3°'), $matches);
    print_r($matches[0]);
    ça donne quoi chez toi.

  3. #3
    Membre régulier
    Inscrit en
    Mai 2007
    Messages
    183
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 183
    Points : 121
    Points
    121
    Par défaut
    Dans mon cas, la source de données est un simple champ de formulaire (La fonction a pour but final de s'adapter à n'importe quel format de données GPS saisie : Degré Décimal, Degré Minute Seconde Décimal, Degré Minute Décimal, etc.)

    Mais ta solution fonctionne très bien. J'ai juste inclue la modif inverse pour un affichage correct.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $matches=array();
    preg_match_all('`(?i:[EW]+\p{^L}+.+\p{^L}+[NS])`', utf8_encode('W -3°'), $matches);
    print_r (utf8_decode($matches[0][0])); // re decoder pour afficher correctement la réponse
    Je me demande dailleurs pourquoi ne devrait pas inclure systématiquement ce code pour prévenir ce genre de dérapage (Watson), voir même inclure l'encodage et le décodage de manière transparente directement dans les fonctions preg (ou un flag de genre PREG_ENCODE_XX dans les paramètres).

    Merci Daniel, réponse efficace et pro.

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

Discussions similaires

  1. [RegEx] [RegExp] preg_match_all
    Par TNorth dans le forum Langage
    Réponses: 6
    Dernier message: 05/02/2006, 22h21
  2. [RegEx] preg_match_all : messages d'erreur récurents
    Par nabab dans le forum Langage
    Réponses: 3
    Dernier message: 13/12/2005, 10h14
  3. [RegEx] preg_match_all : créer un masque :/
    Par Huntress dans le forum Langage
    Réponses: 2
    Dernier message: 22/01/2005, 14h58
  4. [RegEx] preg_match_all et retour chariot ??? comment faire ?
    Par zax-tfh dans le forum Langage
    Réponses: 6
    Dernier message: 26/09/2004, 17h21
  5. [CR10] Watson sur Nouvel Etat ou Ouverture Etat
    Par L.nico dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 07/06/2004, 11h07

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