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 03/04/2006, 11h10   #1
Candidat au titre de Membre du Club
 
Inscription : mars 2006
Messages : 74
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 74
Points : 14
Points : 14
Par défaut Trouver la bonne expression reguliere

Bonjour à vous les amis, je cherche la bonne expression réguliere pour diminuer la taille d'un fichier xml qui est trop lourd pour pouvoir le parser.
J'ai deja essayé avec ce code qui marche pour une chaine de caractère en dure :
Code :
1
2
3
4
5
6
7
8
9
 
<?
$file="catalogtest_fr.xml";
$myFile=fopen($file,"w+");
$tmp=eregi_replace("<amenities>(.*)</amenities>",' ', $myFile);
fwrite($myFile,$tmp);
fclose($myFile);
echo $myFile;
?>
je vous donne un exemple du fichier xml à simplifier :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 
<?xml version="1.0" encoding="ISO-8859-1"?>
<list date="2006-03-29 05:59:31" language="fr" num_hotels="11846">
<p id="12095"> <name>Cambon</name> <address>3, rue Cambon</address> <zip>75001</zip> <type>Hotel</type> <rating>4</rating> <rooms>40</rooms> <availPolicy>IB</availPolicy> <activationDate>2002/02/27</activationDate> <usersRating>0</usersRating>  <mapURL><![CDATA[http://www.venere.com/img/mappe/fr/paris/01.gif]]></mapURL>  <locationURL><![CDATA[http://www.venere.com/maps/show_position.php?lg=fr&geoid=5285&hotel_id=12095&map_id=622&view=map&ref=0]]></locationURL> <venereRanking>492075</venereRanking> <templateType>New</templateType> <translations>
<language lg="en"/>
<language lg="fr"/>
<language lg="de"/>
<language lg="es"/>
</translations> <doublePriceMin>228</doublePriceMin> <doublePriceMax>530</doublePriceMax> <currency>EUR</currency> <geoID>5285</geoID> <lat>48.866021511155100</lat> <lon>2.325050608098880</lon> <macroregion>Surroundings of Paris</macroregion>   <country>France</country> <state/> <region>Ile de France</region> <province>Paris</province> <city>Paris</city> <cityZone>1er arrondissement</cityZone> <propertyURL>http://fr.venere.com/hotels_paris/1er_arrondissement/hotel_cambon.html?ref=0</propertyURL> <amenities>
<amenity>Air conditionné dans tout l'établissement</amenity>
<amenity>Immeuble ancien</amenity>
<amenity>Journaux</amenity>
<amenity>Guide de la ville</amenity>
<amenity>Cartes de la ville</amenity>
<amenity>Informations touristiques</amenity>
<amenity>Dépôt de bagages</amenity>
<amenity>Staff multilingue</amenity>
<amenity>Salle de réunion</amenity>
<amenity>Climatisation individuelle</amenity>
<amenity>Chauffage</amenity>
<amenity>Chambres insonorisées</amenity>
<amenity>Fer et table à repasser disponibles sur demande</amenity>
<amenity>Sèche-cheveux dans la chambre</amenity>
<amenity>Coffre-fort</amenity>
<amenity>Chambres non-fumeur disponibles sur demande</amenity>
<amenity>Mini-bar</amenity>
<amenity>Téléphone direct</amenity>
<amenity>Prise internet</amenity>
<amenity>Ouvert aux groupes</amenity>
<amenity>TV câblée</amenity>
<amenity>Connexion internet Wi-Fi</amenity>
</amenities>  <description lg="fr"><![CDATA[ Elles ont été décorées avec un mélange frappant de design moderne, antiquités et oeuvres d'art originelles. Les variations du design vont des chambres fraîches, avec tons naturels en or, aux chambres avec tapis à bandes bourgognes, violet, orange et bleu. Le staff de l'hôtel est toujours à votre disposition, pour réserver vos tickets ou pour un service de baby-sitting. Une petite salle de réunion, avec une capacité de 8 personnes, est également disponible, ainsi que de nombreux salons.]]></description> 
</list>
Voila en faite je voudrai supprimer dans le fichier toutes les balises <amenuties> et ce qu'il ya à l'interieur. Mon bout de code fonction si je lui passe en dure $chaine=<amenities><toto>.....</toto></amenities>;
Le probleme vient des guillements qui sont interpreté alors qu'il ne faudrait pas.
Si quelqu'un de compétent dans les expressions régulière peut m'aider?
Merci à vous tous.
Dargos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/04/2006, 12h18   #2
Membre régulier
 
Inscription : mars 2006
Messages : 92
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 92
Points : 90
Points : 90
slt,
le pb , c'est la lecture de ton fichier.
fopen retourne retourne un descripteur de fichier
$fi=fopen('toto.txt');
$content=fread($fi,filesize ('toto.txt'));
et ensuite tu appliques ton exp sur $content ..
monsieurjean est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/04/2006, 12h39   #3
Candidat au titre de Membre du Club
 
Inscription : mars 2006
Messages : 74
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 74
Points : 14
Points : 14
Merci pour ta réponse j'étais justement entrain de voir fread().
Par contre j'ai essayé le code :
Code :
1
2
3
4
5
6
7
8
9
10
 
<?
$file="catalogtest_fr.xml";
$myFile=fopen($file,"w+");
$content=fread($myFile,filesize ($file));
print_r($content);
$tmp=eregi_replace("<amenities>(.*)</amenities>",' ', $myFile);
fwrite($myFile,$tmp);
fclose($myFile);
?>
Quand j'execute ce code,j'obtient ma page catalogtest.xml écrasé avec
"Resource id #2" c'est tout.
Toute les balises on disparu. Cela vient il toujours du fopen?
Dargos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/04/2006, 12h43   #4
Membre régulier
 
Inscription : mars 2006
Messages : 92
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 92
Points : 90
Points : 90
attention !
Citation:
$tmp=eregi_replace("<amenities>(.*)</amenities>",' ', $content);
monsieurjean est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/04/2006, 13h01   #5
Candidat au titre de Membre du Club
 
Inscription : mars 2006
Messages : 74
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 74
Points : 14
Points : 14
Merci de ton aide Monsieurjean

J'ai changé mon code comme cela :
Code :
1
2
3
4
5
6
7
8
9
 
<?
$file="catalogtest_fr.xml";
$myFile=fopen($file,"r+");
$content=fread($myFile,filesize ($file));
//print_r($content);
$tmp=eregi_replace("<amenities>(.*)</amenities>",' ', $content);
fclose($myFile);
?>
Mais le probleme c'est quand j'affiche print_r($content); sur ma page. et mon text ne contient plus aucune balise.
Donc le eregi_replace ne marche pas et donc mon fichier n'est pas modifié...
Dargos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/04/2006, 13h26   #6
Membre Expert
 
Avatar de ska_root
 
Homme
Développeur informatique
Inscription : août 2005
Messages : 1 179
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 42
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Service public

Informations forums :
Inscription : août 2005
Messages : 1 179
Points : 1 580
Points : 1 580
normal, le texte modifié est dans la variable $tmp dans ton exemple...

donc :
Code :
1
2
3
4
 
echo "<pre>";
print_r($tmp);
echo "</pre>";
__________________
http://cdemarche.developpez.com/

Tu as la réponse à ta question ? N'oublies pas le petit en bas à gauche de ton message...
ska_root est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/04/2006, 15h37   #7
Candidat au titre de Membre du Club
 
Inscription : mars 2006
Messages : 74
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 74
Points : 14
Points : 14
Merci de vos réponses j'arrive a obtenir une partie du fichier traité.
Mon code
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
<?
$file="venfrance.xml";  //fichier dans lequel je lit
$file2="catalogfin.xml";  //fichier dans lequel j'ecrit
$myFile=fopen($file,"r+");
$myFile2=fopen($file2,"w+");
$content=fread($myFile,filesize ($file));
$tmp=eregi_replace("<amenities>(.*)</amenities>",' ',$content);
fwrite($myFile2,$tmp);
fclose($myFile);
fclose($myFile2);
?>
Le probleme c'est que le traitement ne se fait qu'une seul fois
en fait il parse le fichier xml s'arrete quand il rencontre <amenities> (jusque la c'est normal)
Il va jusqu'au bout du fichier trouve la derniere balise </amenities> et recommence a ecrire.
alors que mon fichier xml est composé de plusieurs

fichier.xml:
<amenities>....</amenities>
<amenities>....</amenities>
<amenities>....</amenities>
cela vient de l'expression réguliere
j'ai essayé

eregi_replace("^<amenities>(.*)</amenities>$",' ',$content);
mais ca n'a pas fonctionné dans ce cas la il me recrit le fichier a l'identique
Dargos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/04/2006, 15h45   #8
Expert Confirmé
 
Avatar de titoumimi
 
Inscription : décembre 2003
Messages : 3 717
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : décembre 2003
Messages : 3 717
Points : 3 082
Points : 3 082
petite question bête ...
dans ce cas précis, ou tes partens à remplacer sont fixes, un simple str_replace ne serait_il pas plus simple ?
titoumimi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/04/2006, 16h02   #9
Candidat au titre de Membre du Club
 
Inscription : mars 2006
Messages : 74
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 74
Points : 14
Points : 14
Merci titoumimi pour ta réponse
ben j'utilise eregi pour pouvoir utiliser mon expression reguliere.
Peut tu m'indiqué comment tu utiliserai str_replace à ma place?
$tmp=str_replace($chaine,' ',$myFile);

Que mettrai tu dans $chaine?
Mon fichier xml ressemble à l'exemple que j'ai affiché sauf que c'est un extrait en réalité il fait 400 000 lignes c pour ca que je veux pas le faire a la main.
Dargos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/04/2006, 16h19   #10
Expert Confirmé
 
Avatar de titoumimi
 
Inscription : décembre 2003
Messages : 3 717
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : décembre 2003
Messages : 3 717
Points : 3 082
Points : 3 082
certes, ca demanderai d'en faire deux consécutifs


Code :
1
2
3
 
$tavar = str_replace("<amenities>", "", $tavar);
$tavar = str_replace("</amenities>", "", $tavar);
sinon, je ne suis pas une bête en regex, mais simplement en utilisant le ? (0 ou 1 fois) pour ton slash ? ca ne te simplifierai pas ton expression ?
titoumimi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/04/2006, 16h50   #11
Candidat au titre de Membre du Club
 
Inscription : mars 2006
Messages : 74
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 74
Points : 14
Points : 14
je veux supprimer les balises <amenities> mais aussi leur contenu c'est pour cela que j'utilise une expression reguliere. Moi aussi je m'y connais pas trop dans les regex.
J'ai pas compris le ? tu veux que je le met comment?

comme ca?
$temp=eregi_replace("<amenties>(.*)</?amenities>",' ',$content);

je viens de tester
$temp=eregi_replace("(<amenties>(.*)</?amenities>)*",' ',$content);
pour dire que j'ai plusieur chaines de caracteres de type
<amenities> ..... </amenities>
mais ca marche pas ca fait comme au par avant ca séléctionne le premier <amenities> et ca va jusqu'au tout dernier </amenities> sans s'arreter
Pourtant y a des </amenities>bien avant.
Je comprend pas HELP
Dargos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/04/2006, 16h56   #12
Expert Confirmé
 
Avatar de titoumimi
 
Inscription : décembre 2003
Messages : 3 717
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : décembre 2003
Messages : 3 717
Points : 3 082
Points : 3 082
ahhh, pardon, je pensait que tu ne voulait supprimer que les balises elles même ...

Bon, je cours me cacher, toutes mes excuses alors
titoumimi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/04/2006, 23h57   #13
Membre Expert
 
Avatar de ska_root
 
Homme
Développeur informatique
Inscription : août 2005
Messages : 1 179
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 42
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Service public

Informations forums :
Inscription : août 2005
Messages : 1 179
Points : 1 580
Points : 1 580
préfères les PCRE aux POSIX tu y gagneras en performances...

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
$content = '
<une balise>coucou</une balise>
<amenities>truc machin</amenities>
<amenities>chose bidule</amenities>
<amenities>bachi bouzouk</amenities>
<une autre>recoucou</une autre>
';
$content=preg_replace('`<amenities>(.*)?</amenities>\n`','',$content);
 
echo "<pre>";
print_r($content);
echo "</pre>";
__________________
http://cdemarche.developpez.com/

Tu as la réponse à ta question ? N'oublies pas le petit en bas à gauche de ton message...
ska_root est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2006, 10h39   #14
Candidat au titre de Membre du Club
 
Inscription : mars 2006
Messages : 74
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 74
Points : 14
Points : 14
Je viens de tester avec preg_replace avec différentes expression mais rien ne marche.
J'ai essayé :

preg_replace('`<amenities>(.*)?</amenities>\n`','',$content);
preg_replace('`<amenities>(.*)?</amenities>`','',$content);
preg_replace('`<amenities>(.*)</amenities>`','',$content);
preg_replace('`<amenities>.*</amenities>\n`','',$content);
preg_replace('`<amenities>.*?</amenities>`','',$content);

Toutes les balises <amenities> et leur contenu restent dans le fichier.
De plus je ne pense pas que le \n soit necessaire car mon fichier xml ressemble à ca :

<truc>tototot</truc><amenities>
<amenity>hghfy</amenity>
<amenity>hghfy</amenity>
<amenity>hghfy</amenity>
</amenities><description>ttotototototototo</description>
<truc>tata</truc><amenities>
<amenity>tititit</amenity>
...
</amenities>

je ne sais pas pourquoi preg_replace ne fonctionne pas.
eregi_replace mais je dois avoir la mauvaise expression reg
Dargos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2006, 15h02   #15
Candidat au titre de Membre du Club
 
Inscription : mars 2006
Messages : 74
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 74
Points : 14
Points : 14
Toujours bloqué

le probleme avec mon expression reguliere,c'est quel s'arrete pas a la bonne balise </amenities>, elle prend la toute derniere de mon fichier alors quel devrait prendre celle qui se trouve 20 lignes plus bas

Mon expression reg
'<amenities>(.*)?</amenities>'
Dargos est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h53.


 
 
 
 
Partenaires

Hébergement Web