Un regex qui marche pas :(

Signaler
Messages postés
47
Date d'inscription
mercredi 20 juillet 2005
Statut
Membre
Dernière intervention
28 mai 2008
-
Messages postés
47
Date d'inscription
mercredi 20 juillet 2005
Statut
Membre
Dernière intervention
28 mai 2008
-
Bonjour , je suis un peut nul en Regex et j'ai bidouillé un script mais
qui marche pas afin de récuperer la note , les commentaires positif et
négatif , le nom et la date de chaque commentaire , voici mon code
(pouvez vous m'aider?)

Merci


----------------------------------------------------------------

5 réponses

Messages postés
239
Date d'inscription
samedi 21 février 2004
Statut
Membre
Dernière intervention
3 juin 2010
1
Salut,

pour pouvoir capturer des données au sein d'une regex, il faut faire appel aux parenthèses capturantes (absentes dans ton masque). Par exemple :

<?php

$string = 'capturez-moi';
$pattern = '#([a-z]+)-([a-z]+)#i';
preg_match_all($pattern,$string,$matches,PREG_SET_ORDER);
echo '',print_r($matches),'

';

?>
Messages postés
388
Date d'inscription
lundi 7 juillet 2003
Statut
Webmaster
Dernière intervention
10 février 2009

Pourquoi faire une regex pour ca ?
normalement, logiquement, tu as stocké ces informations quelques part ( XML, BDD, autres) et la récupérer les infos se fait d'une maniere beaucoup plus triviale.

Sinon, si ton code est bien formé, ton HTML => XML, tu utilises alors le modele DOM ou SimpleXML pour récuperer les informations, cas relativement simple.

Enfin, si tu veux t'amuser avec les expressions rationnelles, regardes ton pattern et aussi des tutos, et tu verras une des raisons pour lesquelles ca marche pas.

Ensuite construit ta regex au fur et a mesure, ou fait en plusieurs (chacune récupérant l'information souhaitée)

"They are 10 sorts of persons those understanding binary and those not"
Messages postés
47
Date d'inscription
mercredi 20 juillet 2005
Statut
Membre
Dernière intervention
28 mai 2008

ok merci, j'ai reussi à bidouiller un truc qui marche :
preg_match_all('#
.*(.*)
.*\+<\/span>(.*)-<\/span>(.*)<\/div>.*(.*)<\/strong>.*-(.*)<\/div>#misU', $texte, $matches, PREG_SET_ORDER);

Par contre lorsque par exemple       "  - Accueil pas agréable  " ou         " +   j\'adore la déco" est absent, le regex ne marche plus , comment faire pour résoudre ce probleme?

Note : je dois récuperer les infos d'une page web distante

Merci
Messages postés
239
Date d'inscription
samedi 21 février 2004
Statut
Membre
Dernière intervention
3 juin 2010
1
Utilise la clause '?' qui indique une ou aucune fois la séquence qui précède. Exemple :

<?php

$pattern = '#(?:-<\/span>(.*)<\/div>)?#';
preg_match_all($pattern,$string,$matches,PREG_SET_ORDER);




?>

NB : la séquence (?:...) indique qu'on ne souhaite pas capturer les données entre ces parenthèses.
Messages postés
47
Date d'inscription
mercredi 20 juillet 2005
Statut
Membre
Dernière intervention
28 mai 2008

alors la merci à tous ! ca marche nikel maintenant ! je met le regex final (ca peux servir à d'autre) :

preg_match_all('#
.*(.*)
.*(?:\+<\/span>(.*))?(?:-<\/span>(.*))?<\/div>.*(.*)<\/strong>.*-(.*)<\/div>#misU', $texte, $matches, PREG_SET_ORDER);