expressions régulières

expressions régulières - PHP - Programmation

Marsh Posté le 16-06-2009 à 16:13:09    

Je sais, n-ième demande, mais je ne parviens toujours pas à les manipuler correctement :/

 

J'essaie de vérifier si une expression ressemble à ça : VAL-SUZON (21121)

 

J'ai tenté ceci, mais visiblement ça ne marche pas :

 
Code :
  1. if(eregi("[:print:]+[:blank:]{1}\[:print:]{1}[:digit:]{5}[:print:]{1}",$location))
  2.       {
  3.       echo 'Bon format';
  4.       }
 

Merci d'avances  :jap:

Message cité 1 fois
Message édité par Yagmoth le 16-06-2009 à 16:13:39

---------------
L'ennemi est bête : il croit que c'est nous l'ennemi alors que c'est lui !
Reply

Marsh Posté le 16-06-2009 à 16:13:09   

Reply

Marsh Posté le 17-06-2009 à 17:32:02    

Yagmoth a écrit :

Je sais, n-ième demande, mais je ne parviens toujours pas à les manipuler correctement :/
 
J'essaie de vérifier si une expression ressemble à ça : VAL-SUZON (21121)
 
J'ai tenté ceci, mais visiblement ça ne marche pas :
 

Code :
  1. if(eregi("[:print:]+[:blank:]{1}\[:print:]{1}[:digit:]{5}[:print:]{1}",$location))
  2.       {
  3.       echo 'Bon format';
  4.       }


 
Merci d'avances  :jap:


Salut,
 
Moi j'utilise pas les ereg*, mais les preg_*
Je te donne donc ma solution avec une expression régulière type PCRE

Code :
  1. $location = 'VAL-SUZON (21121)';
  2. if (preg_match('/[\w\-]+\s\([\d]{5}\)/', $location))
  3. {
  4.     echo 'Bon format';
  5. }


Pour la décomposer :
Le / de début est de fin est le séparateur de l'expression régulière
La zone entre crochets [] suivie d'un + indique que la zone peut se répéter 1 ou N fois
La zone entre crochets [] suivie d'un chiffre entre accolades {5} indique que la zone se répète obligatoirement 5 fois
Le \w signifie tous les caractères alphanumériques
Le \d signifie tous les caractères numériques
Le \s signifie tous les espaces (tabulations, ...)
 
Ce qui nous donne :
[\w\-]+          pour matcher tous les caractères alphanumériques ainsi que le tiret
\s                  pour indiquer qu'on autorise 1 caractère d'espacement
\(                  pour la parenthèse ouvrante
[\d]{5}          pour matcher obligatoirement 5 caractères numériques
\)                  pour la parenthèse fermante
 
Cette expression n'est pas parfaite ; par exemple, elle va matcher la chaîne '---- (00000)' alors que ça ne convient sûrement pas à tes attentes. Mais bon j'ai bien détaillé le principe alors j'espère que ça te permettra d'avancer un peu.
 
Bon courage

Reply

Marsh Posté le 17-06-2009 à 19:07:18    

deuspi a écrit :


[...]
Moi j'utilise pas les ereg*, mais les preg_*
Je te donne donc ma solution avec une expression régulière type PCRE
[...]

+1, les regex de type PCRE sont plus rapides que les POSIX, je t'encourage donc à les utiliser Yagmoth.

Reply

Marsh Posté le 18-06-2009 à 08:53:30    

Merci beaucoup pour l'explication détaillée :jap:


---------------
L'ennemi est bête : il croit que c'est nous l'ennemi alors que c'est lui !
Reply

Marsh Posté le 18-06-2009 à 11:03:11    

Autre souci tant que j'y suis :o

 

Je récupère une liste de données de cette forme :

 
Code :
  1. href="http://www.blabla.com/">Nom du site
 

Seulement quand je tente ceci :

 
Code :
  1. preg_match('/"(.*)">/',$chaine,$resultat)
 

Ca continue à me renvoyer le même résultat, et de surcroit quand je tente un

 
Code :
  1. $pos=strpos('>',$chaine);
 

Ca ne fonctionne pas non plus, aucune valeur n'est renvoyée (et le fait que je remplace par le code html > ne change rien :/)

 

Edit : trouvé, fallait faire un |"(.*)"|U

Message cité 1 fois
Message édité par Yagmoth le 18-06-2009 à 11:08:11

---------------
L'ennemi est bête : il croit que c'est nous l'ennemi alors que c'est lui !
Reply

Marsh Posté le 18-06-2009 à 11:11:41    

Yagmoth a écrit :

Autre souci tant que j'y suis :o
 
Je récupère une liste de données de cette forme :
 

Code :
  1. href="http://www.blabla.com/">Nom du site


 
Seulement quand je tente ceci :
 

Code :
  1. preg_match('/"(.*)">/',$chaine,$resultat)


 
Ca continue à me renvoyer le même résultat, et de surcroit quand je tente un  
 

Code :
  1. $pos=strpos('>',$chaine);


 
Ca ne fonctionne pas non plus, aucune valeur n'est renvoyée (et le fait que je remplace par le code html > ne change rien :/)
 
Edit : trouvé, fallait faire un |"(.*)"|U


Tant mieux que tu aies trouvé. Sinon, pour le strpos, tu t'es gourré d'ordre des paramètres ;)
Il faut faire strpos($chaine, '>') et non l'inverse.

Reply

Marsh Posté le 18-06-2009 à 11:24:14    

deuspi a écrit :


Tant mieux que tu aies trouvé. Sinon, pour le strpos, tu t'es gourré d'ordre des paramètres ;)
Il faut faire strpos($chaine, '>') et non l'inverse.


 
Je file me cacher :D


---------------
L'ennemi est bête : il croit que c'est nous l'ennemi alors que c'est lui !
Reply

Marsh Posté le 18-06-2009 à 13:13:45    

et avec ça : /[\w]{2,}\-[\w]{2,}\s\([\d]{5}\)/
 
Tiens, un bon site pour tester ta regexp sur un texte de ton choix : http://gskinner.com/RegExr/
 
C'est super pratique ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 01-07-2009 à 15:25:52    

bonjour, j'ai un petit soucis avec les regexp, j'ai un texte genre ca  
 

Date: 28 juin 2007  
blabla
QUESTION  
question 1
fin question 1.
RÉPONSE  
réponse 1
finreponse1
Retour à l’index  
Date: 28 juin 2007  
QUESTION  
question 2
fin question 2.
RÉPONSE  
réponse 2
finreponse2
Retour à l’index


je voudrais récupérer les info  (grace a preg_match_all): date, question, réponse
sauf que bien sur ca marche pas, ca recupere uniquement la derniere entrée ( surment a cause des (.*))
 
ma pattern c'est  : /(Date: (\d* \w* \d*)\W+.*QUESTION(.*)RÉPONSE(.*)Retour à l’index)/
 
si quelqu'un a une idée, ou une autre methode que les regexp


Message édité par stealth35 le 01-07-2009 à 15:26:10
Reply

Marsh Posté le 01-07-2009 à 16:42:42    

le pb de  : QUESTION(.*)RÉPONSE(.*) est que le preg va choper la chaine la plus longue ..
selon moi il faudrait remplacer ce que tu ne veux pas
 str_ireplace(array("question","réponse","finreponse" ),"",$data)
& enfin isoler les records (split("date:" )
 
ou inversement isoler les records entre eux (split("date:" )) puis faire ton preg_match


---------------
Photos Panoramiques Montagnes Haute Savoie
Reply

Marsh Posté le 01-07-2009 à 16:42:42   

Reply

Marsh Posté le 01-07-2009 à 16:52:22    

nickel, j'ai fait la 2eme methodes, c'est parfait

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed