Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/05/2007, 15h36   #1
Membre régulier
 
Inscription : mai 2007
Messages : 180
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 180
Points : 82
Points : 82
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."
gomodo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2007, 23h15   #2
Membre habitué
 
Avatar de daniel61
 
Inscription : décembre 2006
Messages : 109
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 109
Points : 120
Points : 120
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 :
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.
daniel61 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2007, 09h56   #3
Membre régulier
 
Inscription : mai 2007
Messages : 180
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 180
Points : 82
Points : 82
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 :
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.
gomodo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h38.


 
 
 
 
Partenaires

Hébergement Web