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 :

Problème sur chaîne et regexp [RegEx]


Sujet :

Langage PHP

  1. #1
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Par défaut Problème sur chaîne et regexp
    Bonjour,

    J'ai une chaine comme ceci par exemple
    [Challenge] titre
    je souhaite uniquement récupérer le "titre" et donc je fais comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match("#\[.*?\](.*?)#",$chaine1,$titre);
    Mais ca passe pas...en tout cas ca m'affiche pas "titre".
    Et pour finir quand je fais un echo de $titre[0] il m'affiche [Challenge]

    Là je suis perdu pouvez vous m'éclairer ???

  2. #2
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    essaie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    preg_match("#^\[.*?\](.*?)$#", $chaine, $match);
    echo $match[1];
    ou alors avec des .* au lieu des .*?
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  3. #3
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Par défaut
    Je l'ai sans le ? et ca fonctionne mais j'ai un nouveau problème...
    Apparemment on peut mettre comme ceci aussi
    /Challenge/ titre
    et donc je mets comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match("#^\[.*\](.*)|^\/.*\/(.*)#",$chaine,$titre)
    et là il me donne plus rien

  4. #4
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    l'opérateur d'alternative ( | ) est celui qui a la priorité la plus basse, donc il faut mettre des parenthèses, ou alors utiliser plutôt les classes de caractères :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    preg_match("#^[[/].*[]/](.*)$#", $chaine, $match);
    echo $match[1];
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    preg_match("#^(\[.*\]|/.*/)(.*)$#", $chaine, $match);
    echo $match[2];
    perso je préfère la première solution
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  5. #5
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Par défaut
    c'est nickel...j'ai mis la première solution comme tu me l'as conseillé.

    Mais peux m'expliquer pourquoi ? avec tout ces [ je suis perdu

  6. #6
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    alors, c'est vrai que les regexp peuvent être un peu déroutantes

    Bon, juste au cas où, un petit rappel sur les classes de caractères dans les regexp

    les classes de caractères permettent d'autoriser un ensemble de caractère càd que le pattern #^[abc]$# matchera s'il est appliqué à l'une des trois chaînes : "a", "b" ou "c" de plus #^[abc]+$# matchera s'il est appliqué à une chaîne composée uniquement de a, b et c contrairement à #^(a+|b+|c+)$# qui matchera des chaînes qui ne seront que soit une suite de a, soit une suite de b, soit une suite de c, j'espère que tu as bien compris la différence

    A noter : tous les meta-caractères autres que ] perdent leur signification (sauf cas particulier que je vais indiquer plus loin )

    ensuite, pour les classes de caractères il existe quatre syntaxes particulières, la première qui permet de spécifier un interval :
    [a-z] permet de valider n'importe quelle lettre minuscule
    [0-9A-Za-z] permet de valider un chiffre héxadécimal,
    on peut aussi faire un mix :
    [A-Z02468a-z] toutes les lettres et les chiffres paires

    etc...

    de ce fait, il est impossible de spécifier un - dans une classe de caractères, sauf (syntaxe spéciale n°2) s'il est spécifié en dernier, càd :
    [a-zA-Z0-9-] permet de spécifier toutes les lettres, tous les chiffres et le tiret.

    la troisième syntaxe, permet de spécifier un ] dans la classe, les classes vides sont refusées donc []a] valide un "a" ou un "]"

    la quatrième est une classe de négation, c'est à dire que ça valide tous les caractères qui ne sont pas indiqués dans la classe, par exemple :
    [^a-zA-Z] validera tout ce qui n'est pas une lettre

    j'espère que tu as bien compris ceci, c'est peut être un peu fouilli, tu peux consulter la doc officielle de PCRE là : http://fr.php.net/pcre (et pages suivantes)

    pour en revenir à notre pattern :
    #^[[/].*[]/](.*)$#


    #^ <= bon pas besoin de moi là début du pattern et demande du début de la chaîne

    [[/] <= classe de caractère composée de [ et / c'est à dire qu'on veut un [ ou un /

    .* <= pas besoin de moi ^^

    [] <= pas de classe vide, donc on ajoute ] et on continue
    []/] <= donc classe avec ] et /

    (.*)$# <= la fin du pattern

    donc en fait, si tu as bien suivi, tu remarqueras que le pattern valide aussi des trucs de la forme "[Chapitre/ Titre" ou "/Chapitre] Titre"

    [Ce que ne fait pas le second pattern ]

    J'espère que c'est suffisament clair
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  7. #7
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Par défaut
    Oui là c'est plus clair pour moi. Et je te remercie pour ce petit cours

  8. #8
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    Je t'en prie j'ai eu du mal avec les regexp au début aussi
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

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

Discussions similaires

  1. Problème sur comparateur de chaînes
    Par Trebor_ dans le forum Langage
    Réponses: 2
    Dernier message: 30/10/2012, 20h25
  2. Problème sur regexp
    Par Nickname dans le forum Langage
    Réponses: 3
    Dernier message: 23/04/2009, 10h37
  3. petit problème sur les listes chaînées
    Par poche dans le forum C
    Réponses: 14
    Dernier message: 19/03/2007, 16h53
  4. Problème sur des chaînes de caractères
    Par Anonymous dans le forum Access
    Réponses: 9
    Dernier message: 16/09/2005, 08h21
  5. problème sur une requête!!!!!
    Par Mcgrady_01 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/06/2003, 01h17

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