Tom's Guide > Forum > Programmation > problème de regex

problème de regex

Forum Programmation : problème de regex

TomsGuide.com : 800 000 inscrits répondent à toutes vos questions high-tech et informatique. Pour obtenir de l'aide, inscrivez-vous gratuitement !
Mot :    Pseudo :           
 

Bonjour,

J'ai une regex qui ne marche pas car je voudrai récupérer uniquement le premier mot alors qu'elle m'en récupère plusieurs, voici un exemple :

Citation :

$source = '<td><span class="Aria14_black"><b>Mercedes Classe C 220</b> CDI Elegance</span></td>';
preg_match('#<td><span[^>]+><b>(.+) (.+)</b>#', $source, $infos);
echo 'source: '.$source.'<br />';
echo 'Marque : '.$infos[1].'<br />';
echo 'Modèle : '.$infos[2].'<br />';



et voilà ce que j'obtient :

Citation :


source: Mercedes Classe C 220 CDI Elegance
Marque : Mercedes Classe C
Modèle : 220



alors que je voudrai obtenir:
source : Mercedes
modèle : Classe C 220

Quelqu'un a t'il la solution ?

:hello:


Message édité par 2Dpix le 10-02-2007 à 16:45:56
Liens sponsorisés
Inscrivez-vous ou connectez-vous pour masquer ceci.

Bonjour,
Ce resultat est normal.
En effet, pour ta premier parenthese, le point equivaut à n'importe quel caractere, dont l'espace, donc la parenthese capture les 3 premier mots.

Je pense queton problemeserait résolu en ajoutant l'option U a la fin de ta regexp (U comme ungreedy- pas gourmand).
ta regexp serait donc:

Code :
  1. #<td><span[^>]+><b>(.+) (.+)</b>#U



Sinon, il suffit de preciser que le caraactere de la premiere parenthese est tout sauf un espace ( cad [^ ] si je ne me trompe pas ).

Voila, j'espere que ca répond à ta question.

Bonne journée :)

PS:Si ton probleme est resolu, merci d'editer ton premier post afin d'indiquer [resolu] dans le titre du sujet :).

Répondre à Halike

merci pour l'aide, j'ai résolu le problème en mettant ([^\ ]+) . J'ai une autre petite question, comment dois je faire si je veut prendre les 2 premiers mots (donc ne prendre qu'un seul espace) ?

Répondre à 2Dpix

tu as 2 possibilités:
- utiliser le parametre U comme indiqué plus haut ou alors utiliser le ?:

Code :
  1. preg_match('#<td><span[^>]+><b>(.+ .+) (.+ .+)</b>#U', $source, $infos);
  2. preg_match('#<td><span[^>]+><b>(.+? .+?) (.+? .+)</b>#', $source, $infos);


Message édité par coca25 le 11-02-2007 à 19:15:08
Répondre à coca25

t'es regex là c'est pour prendre les 2 premier mots ? J'ai testé et ça ne marche pas. peut tu expliquer le (.+ .+) et pourquoi met tu un ? ?

Répondre à 2Dpix

les 2 regexp que j'ai donné te donneront comme resultat:
Mercedes Class
C 220 CDI Elegance

en fait, par défaut, les expressions régulieres compatibles PERL sont gourmandes (ca va chercher la plus longue occurence du masque)
prenons comme source:
Mercedes Classe C 220 CDI Elegance
/.+ .+/ retournera :
- Mercedes Classe C 220 CDI
- Elegance

le ? permet de prendre la plus petite occurence:
/.+? .+/ retournera:
- Mercedes
- Classe C 220 CDI Elegance

apres faut l'adapter à ton besoin

voila :)


Message édité par coca25 le 11-02-2007 à 20:06:37
Répondre à coca25

Merci pour les précisions. Mais j'ai essayer les regexs que tu m'as donné et elles ne marchent pas, je n'arrive pas à les corriger. Pourrai tu me dire ou est l'erreur ?

Répondre à 2Dpix

tu veux avoir quoi exactement?
avec la phrase de départ?

Répondre à coca25

Mercedes Class et
C 220 Elegance .

Répondre à 2Dpix

Code :
  1. $source = '<td><span class="Aria14_black"><b>Mercedes Classe C 220</b> CDI Elegance</span></td>';
  2. preg_match('#<td><span[^>]+><b>(.+? .+?) (.+)</b>(.+)</span>#', $source, $infos);


tu ne peux avoir "C 220 Elegance" y a un </b> dans la phrase

Répondre à coca25

oui désolé je voulais dire C 220 tout court

Répondre à 2Dpix

avec ce qui t'a ete donne avant, tu dois pouvoir trouve ton bonheur non?

Répondre à coca25

oui j'ai réussi merci!

Répondre à 2Dpix
Tom's Guide > Forum > Programmation > problème de regex
Aller à :

Il y a 225 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.

Attention

Vous allez répondre sur un sujet resté inactif pendant plus de 6 mois.
Assurez-vous d'apporter des éléments nouveaux à la discussion avant de poursuivre.

Répondre Annuler
Liens