utilisation des expressions régulières

Répondre
medmidou
le 29/09/2007 à 10:13
medmidou
Salut tout le monde
Je veux effectuer plusieurs modifications sur un fichier texte à travers une interface en PHP.
Alors j'ai utilisé ce code et ça marche très bien :
<?php
$fichier="fichier.txt";

if (file_exists($fichier))
{
if($ouvre=fopen("$fichier","r")) /
{
while (!feof ($ouvre))
{
$lecture = fgets($ouvre, 512);
$donnee=explode("<br>",$lecture);
$combien=count($donnee)-1;

for ($i=0;$i<=$combien;$i++)
{

if (preg_match("#p0*#",$donnee[$i])){$donnee[$i]=preg_replace("#p0*#","/",$donnee[$i]);}
if (preg_match("#[A-Z]-9#",$donnee[$i])){$donnee[$i]=preg_replace("#-9#","9",$donnee[$i]);}
if (preg_match("#/r01s1b0*#",$donnee[$i])){$donnee[$i]=preg_replace("#/r01s1b0*#","-",$donnee[$i]);}


$liste_modif.=$donnee[$i]."";
}
}
}
else
{
echo "L'ouverture du fichier '$fichier' a echoué !!";
exit();
}
}
else
{
echo "Le fichier '$fichier' n'existe pas !!";
exit();
}
fclose($ouvre); // fermeture


$ouvre=fopen("texte.txt","w+");
fwrite($ouvre,$liste_modif);
echo "<center><b>Modification réussie </b></center>";
fclose($ouvre);
?>



Le problème maintenant ce que je veux effectuer trois autres traitements et je n'ai pas su comment?
D’abord voici le fichier texte, elle contient des centaines de blocs comme celui là :

================================================================================
PATH Abis TUN_1006
================================================================================

***** MAIN ROUTE *******

TUN9000-4/8c1
TUN9000-15/1
TUN9043-16/2
TUN9043-15/12
TUN9009-1/2
TUN9009-2/24c01

***** SPARE ROUTE *******

TUN9043-16/2
TUN9043-15/11
TUN9009-1/1
TUN9009-2/24c01


================================================================================
PATH Abis BAR_1017_2
================================================================================

***** MAIN ROUTE *******

TUN9001-2/17c01
TUN9001-1/2
TUN9043-15/5
TUN9043-3/17c1




1. Comment je peux enlever la première et la dernière ligne (les lignes en gras) à l'aide des expression régulières ou autre chose si c'est possible.


2. Comment je peux enlever les espaces a la fin de chaque ligne,j'ai utiliser cette expression régulière mais le problème qu'elle m'enlève même les sauts de ligne :
if (preg_match("#[[:space:]]*$#",$donnee[$i])){$donnee[$i]=preg_replace("#[[:space:]]*$#","",$donnee[$i]);}



3. Comment je peux enlever les sauts de lignes vides


Merci d'avance pour l'aide
LupusMic
le 29/09/2007 à 14:11
LupusMic
J'avais écrit une p'tite bafouille sur expressions normale. Ça peut peut-être t'aider. Et pitié, n'utilises pas space mais \s.
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
LA GLOBULE
le 29/09/2007 à 17:21
LA GLOBULE
Si le fichier n'est pas trop gros et qu'il a toujours la même bouille, tu peux peut être utiliser un basique file et travailler ton tableau ainsi : çà sera simple de supprimer les lignes vides et la première et dernière ligne de chaque section.
LA GLOBULE
le 30/09/2007 à 18:50
LA GLOBULE
Ok, il y'a une autre solution : lire arbitrairement 200 ko du fichier, traiter cette partie, et avancer ainsi de suite. Naturellement, en prenant arbitrairement 200 ko, tu risques de ne pas tomber pile poil entre deux sections, mais rien ne t'empêche de prendre quelques lignes en plus ou en moins pour tomber pile poil sur une fin de section.
mojorisin
le 01/10/2007 à 13:53
mojorisin
Salut,
personnellement vu la structure je le lirait ligne par ligne.
Il te suffit de reconnaitre 5 astériques pour savoir que tu doit initialiser un tableau recevant les données lues (enfin tout dépend de ce que tu souhaites faire de ces données).

Petit algorithme relativement simple.
Je te laisse voir les fonctions feof,fget,array_push, array_shift et consors éventuellement pour les besoins spécifiques
echo ’16i[q]sa[ln0=aln100%Pln100/snlbx]sbA0D4D465452snlbxq’|dc
LupusMic
le 02/10/2007 à 19:57
LupusMic
(mojorisin) Pour ça il faut connaitre à l'avance la taille d'une ligne. Et vu qu'il n'existe pas de fonction pour rapatrier une ligne après l'autre, ben faut la coder soit-même.
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
mojorisin
le 03/10/2007 à 07:58
mojorisin
Salut,
non je ne voit pas de soucis un while(!feof($fp)):
$line = fgets($fp);
endwhile;

fera le boulot tranquillement :)
echo ’16i[q]sa[ln0=aln100%Pln100/snlbx]sbA0D4D465452snlbxq’|dc
Répondre
LoadingChargement en cours