IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Trouver la bonne expression reguliere


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 74
    Points : 46
    Points
    46
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 92
    Points : 102
    Points
    102
    Par défaut
    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 ..

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 74
    Points : 46
    Points
    46
    Par défaut
    Merci pour ta réponse j'étais justement entrain de voir fread().
    Par contre j'ai essayé le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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?

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 92
    Points : 102
    Points
    102
    Par défaut
    attention !
    $tmp=eregi_replace("<amenities>(.*)</amenities>",' ', $content);

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 74
    Points : 46
    Points
    46
    Par défaut
    Merci de ton aide Monsieurjean

    J'ai changé mon code comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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é...

  6. #6
    Membre chevronné
    Avatar de ska_root
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    1 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

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

    Informations forums :
    Inscription : Août 2005
    Messages : 1 203
    Points : 1 839
    Points
    1 839
    Par défaut
    normal, le texte modifié est dans la variable $tmp dans ton exemple...

    donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    echo "<pre>";
    print_r($tmp);
    echo "</pre>";

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 74
    Points : 46
    Points
    46
    Par défaut
    Merci de vos réponses j'arrive a obtenir une partie du fichier traité.
    Mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  8. #8
    Expert éminent
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Points : 7 285
    Points
    7 285
    Par défaut
    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 ?

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 74
    Points : 46
    Points
    46
    Par défaut
    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.

  10. #10
    Expert éminent
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Points : 7 285
    Points
    7 285
    Par défaut
    certes, ca demanderai d'en faire deux consécutifs


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 74
    Points : 46
    Points
    46
    Par défaut
    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

  12. #12
    Expert éminent
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Points : 7 285
    Points
    7 285
    Par défaut
    ahhh, pardon, je pensait que tu ne voulait supprimer que les balises elles même ...

    Bon, je cours me cacher, toutes mes excuses alors

  13. #13
    Membre chevronné
    Avatar de ska_root
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    1 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

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

    Informations forums :
    Inscription : Août 2005
    Messages : 1 203
    Points : 1 839
    Points
    1 839
    Par défaut
    préfères les PCRE aux POSIX tu y gagneras en performances...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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>";

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 74
    Points : 46
    Points
    46
    Par défaut
    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

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 74
    Points : 46
    Points
    46
    Par défaut
    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>'

Discussions similaires

  1. Trouver la bonne expression régulière
    Par Marvelll dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 09/04/2010, 08h13
  2. Recherche la bonne Expression reguliere
    Par Seth77 dans le forum C#
    Réponses: 18
    Dernier message: 28/08/2007, 09h34
  3. [RegEx] trouver un telephone avec expression reguliere
    Par tobiclick dans le forum Langage
    Réponses: 4
    Dernier message: 21/11/2006, 16h42
  4. [langage] surement une expression régulière...
    Par armada dans le forum Langage
    Réponses: 5
    Dernier message: 30/05/2003, 17h06
  5. [langage] expression reguliere motif répétitif dans 1 pattern
    Par comme de bien entendu dans le forum Langage
    Réponses: 11
    Dernier message: 09/04/2003, 16h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo