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 :

regexp - option "non-gourmand"


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 61
    Points : 34
    Points
    34
    Par défaut regexp - option "non-gourmand"
    Bonjour,

    A l'aide d'une expression régulière, j'aimerais retrouver, dans un fichier html, la chaine de caractères "toto" et les tags qui l'entourent directement.

    Assez logiquement, j'utilise l'option "U" pour extraire la plus petite chaine qui matche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    preg_match("#<.+>toto</.+>#iU", $file_content, $matches);
    ...mais appliqué au code html suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <div><a href=""><b>toto</b></a></div>
    j'obtiens ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <div><a href=""><b>toto</b>
    alors que j'aimerais plutôt obtenir ceci :
    Merci pour votre aide précieuse !!!

  2. #2
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Points : 1 565
    Points
    1 565
    Par défaut
    hum, essaye :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match("#<[^>]+>toto</[^>]+>#iU", $file_content, $matches);
    ou meme mieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match('#<([^> \t]+)(?:[ \t][^>]*)?>toto</\1>#iU', $file_content, $matches);

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 61
    Points : 34
    Points
    34
    Par défaut
    Merci pour vos propositions qui m'ont aiguillé vers une solution tout à fait acceptable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    preg_match("#<([a-z]+)[^>]*>toto</\\1>#iU", $file_content, $matches);

  4. #4
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Points : 1 565
    Points
    1 565
    Par défaut
    Citation Envoyé par fabrisss
    Merci pour vos propositions qui m'ont aiguillé vers une solution tout à fait acceptable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    preg_match("#<([a-z]+)[^>]*>toto</\\1>#iU", $file_content, $matches);
    attention tout de meme, ce code ne fonctionne a mon avis que si la balise ne fait qu'un seul caractere, la chaine <div>toto</div> ne fonctionnera pas car pour la balise ouvrante, le 'iv' de div sera capturé par [^>]*

    d'ou mon [ \t][^>]* qui voulait dire : espace ou tab suivi eventuellement de plusieurs caracteres différent de >
    tout ca dans une parenthese (...)? pour dire que c'est optionnel (cas d'une balise sans argument)
    et pour faire joli, j'ai rajouté ?: a l'interieur de la parenthese qui dit que ce n'est pas une parenthese capturante, mais seulement utilisée a des fins de regroupement (pour utiliser le "?" global)

    par contre oui, c'est mieux \\1 pour la référence arriere, j'avais un doute sur le 2eme \, pour ca que j'ai utilisé des apostrophes et non des guillemets ;o)

Discussions similaires

  1. Réponses: 3
    Dernier message: 20/01/2007, 20h36

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