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 :

Détecter un motif sur plusieurs lignes [RegEx]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Août 2009
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 107
    Par défaut Détecter un motif sur plusieurs lignes
    Bonjour,

    Pour trouver le motif ">nom1 DESCRIPTION1" dans une chaîne de caractères , j'utilise le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $chaine= ">nom1 DESCRIPTION1";
    $masque = '/^>([A-Za-z0-9]*)[\s]*[A-Z]*$/';
    $compteur = preg_match($masque,$chaine,$resultat);
    echo '<br>$compteur = "'.$compteur'"'; // Affichage : "$compteur="1"
    print_r(resultat[1]); // Affichage : ">nom1 DESCRIPTION1"
    Jusqu'ici, tout va bien.
    Par contre, si j'ai la chaîne ">nom1 DESCRIPTION1 >nom2 DESCRIPTION2", c'est-à-dire 2 fois le motif de type ">nom DESCRIPTION" , alors $compteur=0 et aucun motif n'est trouvé.

    Sauriez-vous quel masque il faudrait utiliser pour pouvoir détecter le motif ">nom DESCRIPTION" plusieurs fois?

  2. #2
    Membre émérite Avatar de FCYPBA
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 745
    Par défaut
    Bonjour,

    Comment ça va depuis hier ?

    En allant rechercher un peu dans la doc autour de la fonction preg_match tu aurais apercu la fonction preg_match_all qui répond parfaitement à ce que tu veux faire.

    il faut bien entendu modifier un peu la regex pour supprimer les ancrages ( ^ et $ )

    Je te conseille de l'utiliser avec le modificateur PREG_SET_ORDER qui se met en 4ème paramètre

  3. #3
    Membre éclairé Avatar de Pymento
    Homme Profil pro
    Ingé. Info.
    Inscrit en
    Janvier 2008
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingé. Info.

    Informations forums :
    Inscription : Janvier 2008
    Messages : 366
    Par défaut
    t'as essayé ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $masque = '/^[>([A-Za-z0-9]*)[\s]*[A-Z]*]{2}$/';

  4. #4
    Membre confirmé
    Inscrit en
    Août 2009
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 107
    Par défaut
    En utilisant la solution de FCYPBA (je viens bien depuis hier, merci lol! Je viens de me rappeler qu'effectivement tu avais répondu à un de mes posts d'hier...) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    $chaine= ">nom1 DESCRIPTION1 >nom2 DESCRIPTION2";
    $motif = '/^>([A-Za-z0-9]*)[\s]*[A-Z]$/';
    preg_match_all($motif,$chaine,$resultat, PREG_SET_ORDER);
     
    $nb = count($resultat[0]);
    echo '<br>$nb = "'.$nb.'"';
    for($j=0;$j<$nb;$j++)
    {
    	echo '<br>$resultat[0]['.$j.'] = "'.$resultat[0][$j].'"';
    	$nom= $resultat[0][j];
    	echo '<br>$nom= "'.$nom.'"';
    }
    j'obtiens le même résultat qu'au départ.


    Et en utilisant le motif de Pymento avec le "{2] à la fin, j'ai une erreur...

  5. #5
    Membre émérite Avatar de FCYPBA
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 745
    Par défaut
    Penses à modifier la regex. car avec celle-ci commence en début de chaine ( ^ ) et se termine à la fin ( $ ). Ce n'est pas très bien expliqué.

    Il faut pour que cela fonctionne supprimer les ancres ( ^ et $ )

    la regex devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $motif = '/>([A-Za-z0-9]*)[\s]*[A-Z]/';
    De cette façon, on ne cherche pas un motif commençant forcément au début de chaine

  6. #6
    Membre éclairé Avatar de Pymento
    Homme Profil pro
    Ingé. Info.
    Inscrit en
    Janvier 2008
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingé. Info.

    Informations forums :
    Inscription : Janvier 2008
    Messages : 366
    Par défaut
    Citation Envoyé par FCYPBA Voir le message
    Penses à modifier la regex. car avec celle-ci commence en début de chaine ( ^ ) et se termine à la fin ( $ ). Ce n'est pas très bien expliqué.

    Il faut pour que cela fonctionne supprimer les ancres ( ^ et $ )

    la regex devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $motif = '/>([A-Za-z0-9]*)[\s]*[A-Z]/';
    De cette façon, on ne cherche pas un motif commençant forcément au début de chaine




    oui mai de cette façon la chaine " blabla454 >nom1 DESCRIPTION1 toto998" passera.
    Mais en fait c'est pourquoi faire au final ? car après tout dépend de ce que tu veux faire du résultat.

  7. #7
    Membre confirmé
    Inscrit en
    Août 2009
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 107
    Par défaut
    Merci pour toutes vos explications, ça m'a bien fait avancer car j'obtiens maintenant :

    $chaine = ">nom1 DESCRIPTION1 >nom2 DESCRIPTION2"
    $nb = 2
    $resultat[0][0] = ">nom1 DESCRIPTION1"
    $resultat[1][0] = ">nom2 DESCRIPTION2"
    $resultat[0][1] = "nom1"
    $resultat[1][1] = "nom2"

    Par contre, comment peut-on faire pour récupérer de la même façon "DESCRIPTION1" et "DESCRIPTION2"?

    Voici le code :

    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
     
    $chaine = ">nom1 DESCRIPTION1  >nom2 DESCRIPTION2"
    echo '<br>$chaine = "'.$chaine.'"';
    $motif = '/>([A-Za-z0-9]*)[\s]*[A-Z]*/';
     
    $nb = preg_match_all($motif,$chaine,$resultat, PREG_SET_ORDER);
     
    echo '<br>$nb = '.$nb;
    for($j=0;$j<$nb;$j++)
    {
    	for($i=0;$i<$nb;$i++)
    	{
    		echo '<br>$resultat['.$i.']['.$j.'] = "'.$resultat[$i][$j].'"';
    	}
    }
    Merci pour votre aide.

  8. #8
    Membre éclairé Avatar de Pymento
    Homme Profil pro
    Ingé. Info.
    Inscrit en
    Janvier 2008
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingé. Info.

    Informations forums :
    Inscription : Janvier 2008
    Messages : 366
    Par défaut
    et si tu remplace le '{2}' par '*' ?

  9. #9
    Membre confirmé
    Inscrit en
    Août 2009
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 107
    Par défaut
    En remplaçant par une étoile, j'ai la même erreur : "Compilation failed: unmatched parentheses at offset"...

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

Discussions similaires

  1. Ecrire une requete SQL sur plusieurs lignes
    Par PrinceMaster77 dans le forum ASP
    Réponses: 2
    Dernier message: 15/11/2004, 15h47
  2. Response.Write sur plusieurs lignes
    Par simoryl dans le forum ASP
    Réponses: 2
    Dernier message: 31/08/2004, 23h49
  3. Réponses: 2
    Dernier message: 10/05/2004, 08h55
  4. TDBGrid - Un enregistrement sur plusieurs lignes
    Par BRODU dans le forum Bases de données
    Réponses: 2
    Dernier message: 09/05/2004, 08h53
  5. Define sur plusieurs lignes
    Par Gogoye dans le forum C
    Réponses: 6
    Dernier message: 06/10/2003, 12h45

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