Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/12/2006, 22h58   #1
Invité de passage
 
Inscription : décembre 2006
Messages : 14
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 14
Points : 3
Points : 3
Par défaut Supprimer le contenu qui se trouve entre deux délimiteurs

Yop,

Je souhaite parser un fichier texte, pour être plus précis j'aimerai pouvoir supprimer des lignes se trouvant entre deux "délimiteurs".

Exemple :

Si la variable $domaine est égal à domaine.com alors on supprime la partie suivante du fichier texte :
Code :
1
2
3
4
5
6
7
//Debut domaine.com
zone "domaine.com" {
        type master;
        file "domaine.com";
        notify yes;
};
//Fin domaine.com
(Le fichier à parser est named.conf pour les connaisseurs).

Ou //Debut domaine.com et //Fin domaine.com sont les deux délimiteurs.

Donc je vais y aller à coups de fopen, file_get_contents et d'expressions régulières mais je ne sais pas comment lui indiquer la marche à suivre. :/

Voila, si une personnes pouvait me mettre sur le chemin ça serait sympa.
Merci.
goldyfruit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2006, 23h21   #2
Membre émérite
 
Avatar de viviboss
 
Inscription : août 2006
Messages : 943
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Gard (Languedoc Roussillon)

Informations forums :
Inscription : août 2006
Messages : 943
Points : 941
Points : 941
Tu parcouriras le fichier texte ligne par ligne (est-ce que tes valeurs sont lignes par lignes ?) (file_get_contents)

Jusqu'à la fin (feof)

Et ligne par ligne, tu applique ton expression régulière (preg_match)

La fonction preg_match affecte le résultat de ce qu'il trouve selon un "masque", dans un tableau.....

Pour plus d'info sur l'utilisation elles-même des fonctions présentés, un pitit tour sur php.net !!! (ou voir ma signature : c'est toujours bon d'avoir un CHM sur soi.... )
__________________
Veni Vidi Vici
-------------------------
Mes articles : developpez.com ou bien vbview.net
-------------------------
Et SURTOUT ne pas oublier la bible PHP : --> php_manual_fr.chm!!!
Et aussi : --> pear_manual_fr.chm!!!

Ou encore : --> Les tutoriaux & cours PHP de Développez.com
-------------------------
viviboss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2006, 23h31   #3
Invité de passage
 
Inscription : décembre 2006
Messages : 14
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 14
Points : 3
Points : 3
Ouai les valeurs sont lignes par lignes mais type master; notify yes; et }; se répétent à chaque ajouts de zones (je ne sais pas si ça va poser un problème).

Donc ce que je souhaite faire est tout à fait possible ?

Merci de ta réponse.
goldyfruit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2006, 00h52   #4
Invité de passage
 
Inscription : décembre 2006
Messages : 14
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 14
Points : 3
Points : 3
Je bloque au niveau du preg_match, je ne vois pas ce que tu as voulu dire par "ligne par ligne".
Pour le moment j'ouvre le fichier, je fais une boucle qui va tester la fin du fichier mais après je sèche...

Code :
1
2
3
4
5
6
7
8
9
<?php
 
// On ouvre le fichier en lecture/écriture.
$fichier = fopen('./named.conf', 'r+');
 
// On test la fin du fichier, une fois la fin atteinte la boucle s'arrête.
while (!feof($fichier)) {
 
?>
Je suis allé jetter un oeil à la doc mais celle-ci ne me parle pas des masses, pour le moment l'idée que j'ai en tête est d'utiliser preg_replace.
goldyfruit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2006, 01h31   #5
Membre confirmé
 
Homme Emmanuel Thierry
Ingénieur systèmes et réseaux
Inscription : décembre 2003
Messages : 216
Détails du profil
Informations personnelles :
Nom : Homme Emmanuel Thierry
Âge : 24
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Enseignement

Informations forums :
Inscription : décembre 2003
Messages : 216
Points : 219
Points : 219
Essaye ceci :
Code :
preg_replace('/\szone\s"domaine.com"\s\{.\};\s/sU', "\n", $str);
Sékiltoyai est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2007, 17h44   #6
Invité de passage
 
Inscription : décembre 2006
Messages : 14
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 14
Points : 3
Points : 3
Yop,

Désolé du délai de réponse mais je ne m'étais pas repenché sur problème depuis.

Voici le code, cependant le fichier est modifié (date) mais pas le contenu.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
 
$fichier = './named.conf';
$domaine = 'domaine.com';
 
$content = file_get_contents($fichier);
$content = preg_replace("#zone $domaine \{(.+)\};#isU", "\n", $content);
 
$handle = fopen($fichier, 'wb');
fwrite($handle, $content);
fclose($handle);
 
?>
J'ai essayé avec avec l'expression du dessus mais même résultat.
Merci de votre aide.
goldyfruit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2007, 18h57   #7
Modérateur
 
Avatar de Nesmontou
 
Homme Benjamin PREVOT
Architecte de système d'information
Inscription : septembre 2004
Messages : 1 569
Détails du profil
Informations personnelles :
Nom : Homme Benjamin PREVOT
Âge : 30
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Architecte de système d'information
Secteur : Finance

Informations forums :
Inscription : septembre 2004
Messages : 1 569
Points : 2 503
Points : 2 503
Salut, tu peux essayer ce code
Code :
1
2
3
4
5
6
7
8
9
<?php
$file    = './named.conf';
$domaine = 'domaine.com';
$content = file_get_contents($file);
$content = preg_replace('`//Debut ' . $domaine . '\r.*//Fin ' . $domaine . '`smU', '', $content);
if(file_put_contents($file, $content) === false) {
	echo 'erreur !!!';
}
?>
Bon développement
__________________
Si vous ne pouvez expliquer un concept à un enfant de six ans, c'est que vous ne le comprenez pas complètement. Albert EINSTEIN

F.A.Q. : Java, PHP, (X)HTML / CSS

N'oubliez pas de cliquer sur le bouton Résolu en bas de page quand vous avez obtenu une solution à votre problème
Nesmontou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2007, 20h18   #8
Invité de passage
 
Inscription : décembre 2006
Messages : 14
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 14
Points : 3
Points : 3
Merci de ta réponse mais hélas j'ai toujours le même problème, le fichier semble être modifier mais j'ai toujours le contenu qui est censé disparaître.

Je n'ai vraiment aucune idée du problème.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
<php
 
$fichier = './named.conf';
$domaine = 'google.fr';
 
$content = file_get_contents($fichier);
 
$content = preg_replace('`//Debut ' . $domaine . '\r.*//Fin ' . $domaine . '`smU', '', $content);
if(file_put_contents($fichier, $content) === false) {
	echo 'erreur !!!';
}
 
?>
Voici le fichier à parser :

Citation:
//Debut google.fr
zone "google.fr" {
type master;
file "google.fr";
notify yes;
};
//Fin google.fr

//Debut google.com
zone "google.com" {
type master;
file "google.com";
notify yes;
};
//Fin google.com
Je n'ai même pas le message erreur !!! qui s'affiche donc c'est qu'il n'y a pas d'erreur dans le script.
J'ai bien un chmod 777 sur le fichier.

D'autres idées ?
Merci
goldyfruit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2007, 20h34   #9
Invité de passage
 
Inscription : décembre 2006
Messages : 14
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 14
Points : 3
Points : 3
Oki, c'est bon j'ai trouvé la toute petite erreur.
L'expression qui fonctionne est la suivante :
Code :
$content = preg_replace('`//Debut ' . $domaine . '.*//Fin ' . $domaine . '`smU', '', $content);
Et non :
Code :
1
2
 
$content = preg_replace('`//Debut ' . $domaine . '\r.*//Fin ' . $domaine . '`smU', '', $content);
Le \r est coupable !!
Merci Nesmontou
goldyfruit est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h17.


 
 
 
 
Partenaires

Hébergement Web