[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
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
A voir également:
- [php]Probleme avec expression reguliere
- Easy php - Télécharger - Divers Web & Internet
- Expression de recherche - Guide
- Expression encoder - Télécharger - Divers Utilitaires
- Error: expected expression ✓ - Forum C
- Quel fichier contient l’expression trouverpix ? - Forum Programmation
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
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
Donc tu devrais avoir ; $resultat[1]=12, $resultat[2]= 2332, etc
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
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
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
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
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
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 :
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...
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...
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
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
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
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
Promis je regarde ça samedi au plus tard...
Désolé
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é
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");
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");
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
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
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