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 :

Preg_split qui foire un poil [RegEx]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 6
    Par défaut Preg_split qui foire un poil
    Bonjour,

    la question va surement paraitre simple pour pas mal d'entre vous, mais j'ai toujours un problème avec les expressions régulières dans mes fonctions...

    Je voudrais faire un explode d'un texte avec comme séparateur les balises HTML <h3>. Mais ces balises peuvent tantôt être vides d'attributs, tantôt avec style="" ou autre.

    Voici ce que j'ai naïvement fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $decoupe = preg_split('@(<h3(.*)>)@',$texte);
    Evidemment, ça ne marche pas
    Ou est le problème?

    Merci

  2. #2
    Membre Expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Par défaut
    Euhhh pourquoi les @

    c pas plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $decoupe = preg_split('/<h3(.*)>/',$texte);
    Aussi en limitant sur le '.' car tout autoriser est peut être trop ?

  3. #3
    Membre émérite
    Profil pro
    Assistant recherche bioinformatique
    Inscrit en
    Novembre 2007
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant recherche bioinformatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 877
    Par défaut
    Bonjour,
    Tout d'abord, les parenthèses sont inutiles :
    @(<h3(.*)>)@ equivaut à @<h3.*>@

    ENsuite, la solution est de rendre le .* de ton expression 'greedy', c'est a dire de prendre le moins de caractère possible qui verifient l'expression :
    @<h3.*>@ va perndre ce qui commence par <h3, puis va aller le plus loin possible jusqu'a avoir le dernier signe supérieur de $texte.
    @<h3.*?>@ avec le point d'interrogation va chercher la plus petite portion correspondante, soit <h3 jusqu'au 1er signe supérieur.

    Z.

  4. #4
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    c'est pas redondant ???
    * => 0 ou plus
    ? facultatif ...



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $decoupe = preg_split('@(<h3[^>]*>)@',$texte);
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  5. #5
    Membre émérite
    Profil pro
    Assistant recherche bioinformatique
    Inscrit en
    Novembre 2007
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant recherche bioinformatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 877
    Par défaut
    Si c'est redondant, c'est que ca ne fonctionne pas pareil d'une version a l'autre de php. Chez moi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?php
    $texte = "toto<h3 style=\"bla\">bla<h3>pouet";
    $decoupe = preg_split('/<h3.*?>/',$texte);
    var_dump($decoupe);
    ?>
    retourne toto, bla et pouet
    Sans le ?, toto et pouet. Bla n'est pas retourné !

  6. #6
    Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 6
    Par défaut
    Effectivement ça marche chez moi de la même manière que chez Zwiter.

    Merci pour vos réponses, ça marche très bien

  7. #7
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Citation Envoyé par Zwiter Voir le message
    ENsuite, la solution est de rendre le .* de ton expression 'greedy', c'est a dire de prendre le moins de caractère possible qui verifient l'expression
    L'explication est tout à fait valable, mais le vocabulaire est faux :

    - "greedy" signifie "gourmand". C'est le comportement par défaut qui oblige à prendre le plus de caractères possibles.

    - le comportement inverse qui correspond à l'explication est qualifié de "ungreedy" pour "non gourmand". C'est l'explication du modifier U qui inverse le comportement.

    D'autre part, il est encore plus performant de prendre la solution de SpaceFrog, car dans ce cas on profite du caractère "greedy" en balisant correctement.

    Et pour taper dans les coins, la solution la plus performante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $decoupe = preg_split('@<h3[^>]*+>@',$texte);
    - Gain de perf car pas de capture en enlevant les parenthèse.
    - Gain de perf en utilisant le quantificateur atomique *+ qui neutralise le backtracking

  8. #8
    Membre émérite
    Profil pro
    Assistant recherche bioinformatique
    Inscrit en
    Novembre 2007
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant recherche bioinformatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 877
    Par défaut
    merci pour la lecon, et effectivement je me suis trompé sur le terme !

  9. #9
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    snaf ça fait plusieurs fois que je te vois utiliser des suites comme:
    ou tu peux expliciter ?

    quelle est la différence entre
    et
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  10. #10
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    C'est un peu touchy à expliquer et je suis fainéant.

    Mais heureusement, quelqu'un l'a déjà très bien fait avant moi :

    http://www.regular-expressions.info/possessive.html

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Redirection DNS qui foire
    Par Gizmil dans le forum OVH
    Réponses: 3
    Dernier message: 19/01/2008, 18h00
  2. [Réseau] read socket dans while qui foire
    Par let_me_in dans le forum C++
    Réponses: 7
    Dernier message: 21/08/2007, 12h36
  3. Read qui foire
    Par Ziman dans le forum C
    Réponses: 4
    Dernier message: 11/12/2006, 14h47
  4. Evenement dbl click qui foire
    Par louroulou dans le forum Access
    Réponses: 5
    Dernier message: 20/06/2006, 17h34
  5. poste de travail qui foire
    Par flo456 dans le forum Autres Logiciels
    Réponses: 8
    Dernier message: 03/04/2006, 16h04

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