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 :

difference entre .*? et .*


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Inscrit en
    Février 2010
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 83
    Points : 50
    Points
    50
    Par défaut difference entre .*? et .*
    Bonjour je ne comprend pas quel est la différence entre .*? et .*

    car * et ? sont tout deux des quantificateur
    qu'est ce que le ? apporte de plus a cette expression .*?
    merci d'avance

  2. #2
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    Bonjour,
    A moins de limité le *, je ne vois pas a quoi cela sert, même pourquoi limité le *

    Tu as vu ça dans quel cadre ?

  3. #3
    Membre du Club
    Inscrit en
    Février 2010
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 83
    Points : 50
    Points
    50
    Par défaut
    je voulais faire un replace de se qui se trouve entre /* */ par string.empty

    et quand j ' ai plusieurs notreplace/*Content*/ dans la chaine et que j' utilise .* il va faire un remove sur tout sauf se qui est devant le premier
    il ne garde que le premier des notreplace, donc j ai été contrain de faire ceci dans ma regex .*?

  4. #4
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    Alors cela veut dire qu'il prend la fin

  5. #5
    Membre du Club
    Inscrit en
    Février 2010
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 83
    Points : 50
    Points
    50
    Par défaut
    ces pour cela qu il faut limiter * si je comprend bien

  6. #6
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    le ? représente la fin de la chaine, donc oui

  7. #7
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    le "?" la fin de chaine ???? c'est "$" la fin de chaine !!!!

    la différence entre * et *? est je crois que la première version va essayer de matcher avec le pattern qui comporte le plus de caractère alors que le second va essayer de matcher avec le motif qui en comporte le moins.*

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    preg_match_all('#a.*?a#', 'amanapa', $arr, PREG_PATTERN_ORDER);
    preg_match_all('#a.*a#', 'amanapa', $arr, PREG_PATTERN_ORDER);
    pour aller plus loin cherche regex+lazy et regex+greedy.


    MaitrePylos -1.
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  8. #8
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    Oui,oui me suis trompé. Arrive a tout le monde.

  9. #9
    Membre du Club
    Inscrit en
    Février 2010
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 83
    Points : 50
    Points
    50
    Par défaut
    OK je vous remercie pour vos réponse

  10. #10
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Éffectivement, le ? sert à passer un quantificateur (* + {n,}) de greedy à non-greedy par défaut. Mais il sert aussi à faire le contraire (non-greedy->greedy) si on utilise le modifier U qui rend tous les quantificateurs de la pattern non-greedy. De plus, il peut être inopérant selon les circonstances.

    exemple:
    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
    $string = 'Janine mange des bananes.'; // cette chaîne comporte la sous-chaîne "an" deux fois de part et d'autre de la lettre g
    $patterns = array( // avec les quantificateurs greedy (par défaut)
                       '/[^g]*(an[^g]*g.*an)/', '/^[^g]*?(an[^g]*g.*an)/', '/^[^g]*(an[^g]*g.*?an)/', '/^[^g]*?(an[^g]*g.*?an)/',
     
                       // avec les quantificateurs non-greedy (par le modifier U)
                       '/^[^g]*?(an[^g]*g.*?an)/U', '/^[^g]*(an[^g]*g.*?an)/U', '/^[^g]*?(an[^g]*g.*an)/U', '/^[^g]*(an[^g]*g.*an)/U' );
    // le quantificateur du milieu peut être greedy ou non-greedy,
    // cela n'a pas d'importance, car il est coincé à droite par la lettre g et obligé d'aller jusqu'à elle,
    // et à gauche par le premier quantificateur qui est évalué avant lui.
    // C'est le premier quantificateur qui, évalué en premier, conditionne la taille de la capture à gauche du g.
    // Le test s'effectue uniquement sur le premier et le dernier quantificateur.
     
    foreach ($patterns as $pattern) {
        preg_match( $pattern, $string, $match);
        echo $match[1] . '<br/>';
    }
    On obtiens :
    ange des banan
    anine mange des banan
    ange des ban
    anine mange des ban
    ange des banan
    anine mange des banan
    ange des ban
    anine mange des ban


    À ce titre le ? peut être plutôt considéré comme un commutateur greedy/non-greedy.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

Discussions similaires

  1. Différences entre Delphi et Visual Basic ?
    Par Anonymous dans le forum Débats sur le développement - Le Best Of
    Réponses: 75
    Dernier message: 30/03/2009, 20h09
  2. La difference entre XSL et XSLT?
    Par pantin dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 27/06/2003, 15h14
  3. Difference entre fenetre et boite de dialog
    Par billyboy dans le forum Windows
    Réponses: 2
    Dernier message: 02/06/2003, 15h43
  4. [] Difference entre MSHFlexGrid et MSFlexGrid
    Par olivierx dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 23/04/2003, 08h48
  5. Difference entre types d'Adresse IP
    Par freud dans le forum Développement
    Réponses: 3
    Dernier message: 02/03/2003, 02h06

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