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 :

Expression régulière. Ca semble bête et pourtant je bloque :/


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 88
    Points : 40
    Points
    40
    Par défaut Expression régulière. Ca semble bête et pourtant je bloque :/
    Bonjour !

    Alors mon problème c'est que j'ai un morceau de page HTML constituée comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $texte =
    ' Bla bla bla bla
    <div id="categorie">un texte qui a une longueur variable et donc qui peut changer</div>
    <div>Encore du texte</div>
    <div>Et encoooore du texte</div>
    hahahahaha ';

    J'aimerai supprimer la div dont l'id est "catégorie" ainsi que son contenu. Donc j'ai testé ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_replace  (  '/(<div id="categorie">)(.)+(<\/div>)/i'  ,  ""  ,  $texte );

    Le problème c'est qu'il ne comprend pas qu'il faut s'arréter à la fin de la première Div et il me supprime donc tout jusqu' à la dernière Div contenue dans la variable $texte.

    Autrement dit quand je fais un echo de ma variable il reste: "Bla bla bla bla hahahahaha"
    alors que j'aimerai que ma variable contienne : "Bla bla bla bla <div>Encore du texte</div><div>Et encoooore du texte</div>hahahahaha"

    Pouvez vous m'aider s'il vous plait ?
    Je suis certain que c'est facile mais je ne trouve pas :/


    Merci d'avance

  2. #2
    Membre émérite
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Points : 2 411
    Points
    2 411
    Par défaut
    Salut,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_replace('%(<div id="categorie">.+?</div>)%i', '', $texte);

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 88
    Points : 40
    Points
    40
    Par défaut
    Merci beaucoup !

  4. #4
    Membre émérite
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Points : 2 411
    Points
    2 411
    Par défaut
    C'est la présence du signe ? qui rend la recherche moins "gloutonne".

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 88
    Points : 40
    Points
    40
    Par défaut
    Comment ca ?

    Ah j en profite pour te demander.
    Si je veux faire l'inverse comment dois je faire ?
    C'est à dire, si je veux garder le contenu de la balise "catégorie"...

    Je fais ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ereg ('%(<div class=catégorie">.+?<\/div>)%i', $texte, $regs);
    echo $regs[1];
    Je suis un peu sceptique :s

  6. #6
    Membre émérite
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Points : 2 411
    Points
    2 411
    Par défaut
    Le signe ? permet de s'arrêter au premier </div> trouvé.

    Pour garder le contenu de la balise "categorie", nous ne capturons que lui
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_replace('%<div id="categorie">(.+?)</div>%', '$1', $texte)
    ainsi, $1 contient uniquement les caractères (.+?) situés entre <div id="categorie"> et </div>.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 88
    Points : 40
    Points
    40
    Par défaut
    Citation Envoyé par Eric2a Voir le message
    Le signe ? permet de s'arrêter au premier </div> trouvé.

    Pour garder le contenu de la balise "categorie", nous ne capturons que lui
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_replace('%<div id="categorie">(.+?)</div>%', '$1', $texte)
    ainsi, $1 contient uniquement les caractères (.+?) situés entre <div id="categorie"> et </div>.


    Es tu certain que c'est preg_replace ? J'aurai plutot pensé à ereg.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 88
    Points : 40
    Points
    40
    Par défaut
    De plus lorsque j'utilise ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    eregi('%<div id="ires">(.+?)</div>%', $contenu_a_save, $texte);
    echo $contenu_a_save;
    Voila l'erreur que ca me retourne :
    Warning: eregi() [function.eregi]: REG_BADRPT

    Je ne comprends pas pourquoi. J'ai cherchais et beaucoup dise que c'est un problème de [] mais là je n'en vois pas... :/

  9. #9
    Membre émérite
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Points : 2 411
    Points
    2 411
    Par défaut
    Sûr et certain

    ereg était déjà obsolète depuis longtemps. Il est aujourd'hui déprécié à partie de la version 5.3 de PHP me semble t-il.

    EDIT : Je ne connais pas cette erreur car je n'ai jamais utilisé eregi.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 88
    Points : 40
    Points
    40
    Par défaut
    Ok

    Par contre voici les nouvelles erreurs :

    Warning: preg_split() expects parameter 2 to be string, array given in C:\wamp\www\...
    Warning: array_shift() [function.array-shift]: The argument should be an array

    Une idée d'où ca peut venir ? :/

    Merci beaucoup de toutes tes réponses

  11. #11
    Membre émérite
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Points : 2 411
    Points
    2 411
    Par défaut
    Montre le bout de code où tu utilises preg_split et array_shift()

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 88
    Points : 40
    Points
    40
    Par défaut
    Justement je ne les utilisent pas
    Mais bon apparemment j'avais mal renseigné les paramètres.

    Je regarde à nouveau et je te re dis

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 88
    Points : 40
    Points
    40
    Par défaut
    Je suis perdu...
    Mon code HTML a évolué, en fait avec filegetcontent() je récupère le contenu d'une page html qui est dans un autre dossier.
    Ensuite je désire récupérer le contenu de chaque balise Li avec comme class : "sous_categorie".

    Donc je fais :
    echo preg_match('%<li class="sous_categorie">(.+?)</li>%', $fichier_html);

    Et il me retourne 0, alors que je suis certain que cette balise existe dans le contenu du fichier récupéré. (elle est même présente 3 fois)

    A quoi est ce du ?

  14. #14
    Membre émérite
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Points : 2 411
    Points
    2 411
    Par défaut
    Dans cas, c'est preg_match_all qui va nous retourner le contenu des balises <li class="sous-categorie"> dans un tableau.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    preg_match_all('%<li class="sous_categorie">(.+?)</li>%si', $fichier_html, $tab, PREG_PATTERN_ORDER);
    foreach ($tab as $data) {
    	echo $data.'<br>';
    }

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 88
    Points : 40
    Points
    40
    Par défaut
    Peux tu m expliquer ce code stp?
    Pourquoi ce flag utilisé ?

  16. #16
    Membre émérite
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Points : 2 411
    Points
    2 411
    Par défaut
    La meilleure documentation pour PHP c'est l'officielle > preg_match_all().
    PREG_PATTERN_ORDER
    L'ordre est tel que $matches[0] est un tableau qui contient les résultats qui satisfont le masque complet, $matches[1] est un tableau qui contient les résultats qui satisfont la première parenthèse capturante, etc.

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 88
    Points : 40
    Points
    40
    Par défaut
    Oui certes

    Cependant il me retourne
    tab[0] = Array
    tab[1] = Array

    En plus de devoir retourner 2 tab null il devrait m'en renvoyer 3... car y a trois morceau de code qui satisfait à la reg exp :/

    Désolé de t embêter autant :s

  18. #18
    Membre émérite
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Points : 2 411
    Points
    2 411
    Par défaut
    C'est $tab[1] qu'il fallait mettre...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    preg_match_all('%<li class="sous_categorie">(.+?)</li>%si', $fichier_html, $tab, PREG_PATTERN_ORDER);
    foreach ($tab[1] as $data) {
    	echo $data.'<br>';
    }

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 88
    Points : 40
    Points
    40
    Par défaut
    Ca marche mieux
    Mais j'ai un probleme...je ne sais pas si ca vient de la reg exp (ca m étonnerait) mais l'opération marche quand je fais ceci :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $contenu = '<li class="sous_categorie">A</li>
    B<li class="sous_categorie">C</li>D<li class="sous_categorie">E</li>';
     
    preg_match_all('%<li class="sous_categorie">(.+?)</li>%i', $contenu, $tab, PREG_PATTERN_ORDER);
    foreach ($tab[1] as $data)
    {
    	echo $data.'<br />';
    }
    Ce code me retourne A C E ce qui est correct.

    Maintenant quand je fais ceci ca ne marche pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $contenu = file_get_contents('mon_fichier_qui_contient_les_memes_balises');
    Pourquoi ? :/

  20. #20
    Membre émérite
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Points : 2 411
    Points
    2 411
    Par défaut
    Regarde ta nouvelle expression rationnelle... Tu as supprimé le caractère s qui permet de prendre en compte les sauts de ligne éventuels.
    '%<li class="sous_categorie">(.+?)</li>%si'

Discussions similaires

  1. [RegEx] expression régulière qui marche pas et pourtant
    Par bigs3232 dans le forum Langage
    Réponses: 6
    Dernier message: 19/03/2010, 17h29
  2. Réponses: 1
    Dernier message: 04/05/2009, 08h31
  3. [expression régulière] mon cerveau fait des noeuds..
    Par nawac dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 27/05/2003, 10h06
  4. Expressions réguliéres
    Par Tooms dans le forum Langage
    Réponses: 4
    Dernier message: 06/12/2002, 18h42
  5. Réponses: 5
    Dernier message: 11/06/2002, 15h21

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