[php]Probleme avec expression reguliere

Résolu/Fermé
padnom Messages postés 6 Date d'inscription jeudi 3 avril 2008 Statut Membre Dernière intervention 14 avril 2009 - 3 avril 2008 à 09:51
sly-bzh Messages postés 415 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 5 décembre 2009 - 10 avril 2008 à 19:12
Bonjour,
Voila c'est la premiere fois que je viens sur ce forum j'éspère être dans la bonne section.
Voici mon problème:
J'ai une chaine de caractère qui va se présenter de la facon suivante
12-2332-[ski-nautique]-032249-[voyage-vietnam232]-4343
ce que je veux obtenir c'est le résultat suivant :
reponse1:12
reponse2:2332
reponse3:[ski-nautique]
reponse4:032249
reponse5:[voyage-vietnam232]
reponse6:4343

je veux récuperer toutes les valeurs séparées par un "-"en sachant que les"-" compris entre crochet ne doivent pas etre pris en compte.Mais aussi je dois garder l'ordre dans lequel apparaissent les réponses.

J'ai tenté de faire dans un premier dans un explode sur les "-[" puis un explode sur "-" ceci n'a rien donné.
Ensuite j'ai farfouillé sur le net et j'ai trouvé les expressions regulieres le gros souci c'est que pour moi c'est du chinois...
J'ai buté toute une journée afin de déterminer cette expression régulière sans aucun resultat.
Si quelqu'un pourrait m'aider.
Merci d'avance.En esperant avoir était clair.
A voir également:

6 réponses

sly-bzh Messages postés 415 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 5 décembre 2009 118
3 avril 2008 à 14:10
Bonjour,
Je te proposes ce code mais je ne l'ai pas testé donc en cas de soucis n'hésite pas à repasser ;)
On va stocker les valeurs que tu souhaite dans un tableau
    
// Tout d'abord tu met ton texte dans un fichier .txt que tu va ouvrir et lire
$contenuFichier = file_get_contents("ski.txt"); 
// LA fameuse expression régulière. Si tu a bossé un peu tu devrais la comprendre, elle est assez simple
$expressionRationnelle = "#([0-9]*)-([0-9]*)-(\[[a-zA-Z0-9-]*\])-([0-9]*)-(\[[a-zA-Z0-9-]*\])-([0-9]*)#";
$resultat = Array();
// La fonction preg_match_all est très utile tu trouveras bcp de doc dessus sur le web c'est elle qui va stocker les valeurs dans le tableau $resultat
preg_match_all($expressionRationnelle, $contenuFichier, $resultat, PREG_PATTERN_ORDER);
// Et enfin on affiche le résultat 
echo "<pre>";
   print_r($resultat);
echo "</pre>";

Donc tu devrais avoir ; $resultat[1]=12, $resultat[2]= 2332, etc
0
padnom Messages postés 6 Date d'inscription jeudi 3 avril 2008 Statut Membre Dernière intervention 14 avril 2009
4 avril 2008 à 09:43
Merci pour le coup de main, mais en fait j'ai du mal me faire comprendre dslé. Ma chaine de caratère ne va pas forcément se présenter toujours de la même facon d'une manière plus générale elle pourrait se présenter de la facon suivante:

XXXX-XX-[XXXYY-XXX-YY]-[XXX-YYYY]-XXXXX-XXXX
ms elle pourrait aussi se presenter de cette maniere etc etc...:
[XX-YYYYY]-XXX-XXX-[YYYY-XXXX]

ou X= valeur numerique et Y=valeur alphabetique
0
sly-bzh Messages postés 415 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 5 décembre 2009 118
5 avril 2008 à 00:08
Ah ben c'est sûr que si toutes les lignes n'ont pas EXACTEMENT la même structure ça change tout
Dans ce cas là je t'avoue ne pas savoir très exactement comment faire mais je t'ai bidouillé un petit truc qui semble fonctionner mais il n'est surement pas optimisé, propre, rapide (mais bon j'ai fait 2-3 essais et ça semble marcher...) :
Dans le code que j t'ai donné, tu remplaces la ligne $expressionRationnelle = ......... par :
$expressionRationnelle = "#(\[*[a-zA-Z0-9-]*\]*)-*(\[*[a-zA-Z0-9-]*\]*)-*(\[*[a-zA-Z0-9-]*\]*)-*(\[*[a-zA-Z0-9-]*\]*)-*(\[*[a-zA-Z0-9-]*\]*)-*(\[*[a-zA-Z0-9-]*\]*)\r*\n*#";

2 ou 3 petites choses sur ce truc qui pourrait ressembler de loin et dans le noir à un bout de code (j'avoue avoir un peu onte de ce que j'ai sorti là mais bon si ça peut aider)
2 ou 3 précisions donc : tout d'abord, il faudra que tu vérifies le nombre maximal d'éléments que tu pourras avoir. Tu copies alors la partie -*(\[*[a-zA-Z0-9-]*\]*) autant de fois que tu en auras besoin au maximum.
Ensuite, pour ce qui est des parties entre [ ], il n'ya pas de problème, ça ressort propre. En revanche, quand tu n'as pas de crochet, ton chiffre se terminera par un tiret :S Pour résoudre ça je te laisse un peu bosser mais ça ne devrais pas être trop dur.
Et enfin, comme tu t'en est probablement aperçu, les résultats sortent dans un tableau associatif, tu ne devrais donc pas avoir de mal à les récupérer.

Si certaines choses ne sont pas clair, je serais là et j'essayerais de te répondre le plus vite possible.

PS. Désolé de ne pas avoir répondu plus tôt...
0
dslé de repondre si tard je viens de recuperer le net...
je test sa dans l'aprem et je te tiens au courant merci en tt cas
0
Voila je te montre mon fichier entier et la ou j ai utilisé ton expression reguliere que j ai legerement modifié :



function traiteXML($chaine){

$chaine = str_replace("’","'",$chaine);
$chaine = str_replace("’","'",$chaine);
$chaine = str_replace("…","...",$chaine);
$chaine = str_replace("«","\"",$chaine);
$chaine = str_replace("»","\"",$chaine);
$chaine = str_replace("«","\"",$chaine);
$chaine = str_replace("»","\"",$chaine);
$chaine = str_replace("“","\"",$chaine);
$chaine = str_replace("”","\"",$chaine);
$chaine = str_replace("€","[-SigleEuro-]",$chaine);
return ($chaine!="")?trim($chaine):"";


}



global $config_site;
$survey=$_GET['id'];
$strhis = "SELECT * FROM nabopoll_history where survey=$survey ORDER BY instant";
$reshis = mysql_query($strhis);
$arr=array();
$nbreponse==0;
$nbligne==0;
$i=1;

while($rowhis = mysql_fetch_object($reshis)){

$date = substr($rowhis->instant,0,10);
$heure =substr($rowhis->instant,11,10);
$expressionRationnelle = "#(\[*[a-zA-Z0-9-]*\]*)-*(\[*[a-zA-Z0-9-]*\]*){30}\r*\n*#";
$chaine.=$rowhis->Num_OD.chr(9).$rowhis->ip.chr(9).$date.chr(9).$heure;
$ans = $rowhis->answers;
$resultat = Array();
preg_match_all($expressionRationnelle, $ans, $resultat, PREG_PATTERN_ORDER);
$result = count($resultat);
foreach($resultat as $key => $ans3){
$chaine.=chr(9).$ans3;
}
$chaine.="\n";
}


$chaineFinale = "Num_OD".chr(9)."IP".chr(9)."date".chr(9)."heure";
while($result>1){
$chaineFinale.=chr(9)."reponse".$i;
$i++;
$result=$result-1;
}
$chaineFinale.=chr(13).chr(10).$chaine;

$numsondage=$_GET['id'];
$fic = @fopen($cheminUpload."upload/Resultat_Sondage_$numsondage.txt","w");
//echo "fic=".$fic;
if ($fic)
{
@fwrite($fic,utf8_encode($chaineFinale));
@fclose($fic);
}




switch(strrchr(basename($Fichier_a_telecharger), ".")) {

case ".gz": $type = "application/x-gzip"; break;
case ".tgz": $type = "application/x-gzip"; break;
case ".zip": $type = "application/zip"; break;
case ".pdf": $type = "application/pdf"; break;
case ".png": $type = "image/png"; break;
case ".gif": $type = "image/gif"; break;
case ".jpg": $type = "image/jpeg"; break;
case ".txt": $type = "text/plain"; break;
case ".htm": $type = "text/html"; break;
case ".html": $type = "text/html"; break;
default: $type = "application/octet-stream"; break;

}



$file=$_GET['Fichier_a_telecharger'];

//telechargement
$taille=filesize("upload/$file");
header("Content-Type: application/force-download; name=\"$file\"");
header("Content-Transfer-Encoding: binary");
header("Content-Length: $taille");
header("Content-Disposition: attachment; filename=\"$file\"");
header("Expires: 0");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
readfile("upload/$file");
exit();
?>

le probleme est qu il me sort en valeur array et non les valeur de mon tableau surement qqchose que j ai pas compris avec pregmatch ou un problement avec mon foreach
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sly-bzh Messages postés 415 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 5 décembre 2009 118
9 avril 2008 à 16:04
Désolé mais là je n'ai absolument pas le temps de regarder, j'ai un rapport de stage à rendre demain...
Sinon s'il te met array() essaye de faire un
echo "<pre>";
   print_r($resultat);
echo "</pre>";
pour voir ce qu'il y a dans ton tableau (mais aussi bien je me plante complètement, pas le tps de vérifier)
Promis je regarde ça samedi au plus tard...

Désolé
0
du coup j ai fait autrement, j ai d'abord remplacé les "_" entre mes crochets puis fait un explode des tirets restants pour ensuite remettre mes "-" entre crochet, bon c'est pas tres propres mais sa marche, merci en tt cas pour ton aide.
while($rowhis = mysql_fetch_object($reshis)){
$date = substr($rowhis->instant,0,10);
$heure =substr($rowhis->instant,11,10);
$chaine.=$rowhis->Num_OD.chr(9).$rowhis->ip.chr(9).$date.chr(9).$heure;
$ans = $rowhis->answers;
$ans2= preg_replace("/\[([^\]]*)\]/ie", '"[".str_replace("-", "¤", "$1")."]"', $ans);
$ans3 = explode("-",$ans2);
$result = count($ans3);
foreach($ans3 as $key => $ans4){
$chaine.=chr(9).$ans4;
}
$chaine.="\n";
}

$chaineFinale = "Num_OD".chr(9)."IP".chr(9)."date".chr(9)."heure";
while($result>0){
$chaineFinale.=chr(9)."reponse".$i;
$i++;
$result=$result-1;
}
$chaineFinale.=chr(13).chr(10).$chaine;
$chaineFinale = str_replace("¤", "-", "$chaineFinale");
0
sly-bzh Messages postés 415 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 5 décembre 2009 118
10 avril 2008 à 19:12
:( Désolé de pas avoir pu t'aider :(
Mais heureux que tu ais réussi à résoudre le problème toi même.

A l'avenir, les expressions régulières sont à utiliser vraiment quand tes chaines de caractères sont exactement identiques.

Bonne continuation
0