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 :

Chaine se terminant par un tiret suivi de 1, 2 ou 3 chiffres [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    530
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 530
    Points : 316
    Points
    316
    Par défaut Chaine se terminant par un tiret suivi de 1, 2 ou 3 chiffres
    Bonjour à tous,

    Comme l'indique le titre de mon post je cherche à détecter les chaines de caractères se finissant par un tiret (-) suivi de 1, 2 ou 3 chiffres.

    Comme je ne comprend pas grand chose aux expressions régulières, j'essaye en commençant par quelque chose de simple : détecter dans ma liste de chaines de caractères celles se terminant par 1, 2 ou 3 chiffres.

    Comme il s'agit de fichiers, je commence par écarter l'extension, ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach($tabImg as $num => $img){
    	$tab = explode(".", $img);
    	if(preg_match('#[0-9]\z#', $tab[0])) echo $img."<br />";
    };
    Or je me retrouve par exemple avec ceci :
    2013_06_TOY-MACHINE-DECK-8.25-TEMPLETON-ELEPHANT-PAR.jpg

    Dans les documentations que j'ai trouvé, j'avais cru comprendre que \z indiquait la fin de la chaine testée...

    Pouvez-vous m'aider à comprendre ?

    Merci d'avance pour vos réponses

  2. #2
    Invité
    Invité(e)

  3. #3
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 051
    Points : 1 638
    Points
    1 638
    Par défaut
    Je ne suis pas expert également, mais il faudrait certainement préciser la taille de la fin de chaîne : Préciser à ton expression que tu peux avoir seulement un ou deux chiffre à la fin, précéder d'un tiret. Ca devrait ressembler à ceci :
    Je ne sais pas si c'est la synthaxe exacte, mais en gros dire que ta châine finit par un tiret (touche 6), suivi d'un chiffre entre 0 et 9. Surement l'adapter pour lui dire qu'il y a un ou deux chiffres
    Règle N° 1 : Si tout va bien, ne touchez à rien.

  4. #4
    Invité
    Invité(e)
    Par défaut
    @bob633 :
    on trouve des réponses dans le lien que j'ai mis ci-dessus.
    Encore faut-il prendre le temps de cliquer dessus, et de lire le tuto.

    [Edit] Ce n'est JAMAIS une perte de temps de lire un tuto.
    Ni de chercher.
    J'ai moi-même beaucoup appris en cherchant des réponses pour les autres.
    Dernière modification par Invité ; 09/08/2013 à 17h48.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    530
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 530
    Points : 316
    Points
    316
    Par défaut
    Merci de vos réponses !

    @jreaux62 : hé bien il se trouve que je dois être particulièrement idiot puisque c'est en suivant ce tuto que je suis arrivé à mon expression qui ne fonctionne pas.

    @bob633 : avant même de chercher à détecter le tiret, je cherche à détecter que ma chaîne de caractère se termine par un chiffre c'est pourquoi j'ai utilisé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(preg_match('#[0-9]$#', $tab[0]))
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(preg_match('#[0-9]\z#', $tab[0]))
    Mais à chaque fois je récupère aussi des chaines se terminant par des lettres...

    @jreaux :
    Encore faut-il prendre le temps de cliquer dessus, et de lire le tuto.
    D'une grande clairvoyance : avant même que j'ai répondu quoi que ce soit tu savais déjà que je ne m'étais même pas donné la peine de cliquer sur ton lien... chapeau bas.
    C'est d'ailleurs pour cela que je viens sur ce forum, pour que quelqu'un me reconnaisse à ma vraie valeur.

  6. #6
    Expert éminent sénior

    Avatar de FirePrawn
    Homme Profil pro
    Consultant technique
    Inscrit en
    Mars 2011
    Messages
    3 179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique

    Informations forums :
    Inscription : Mars 2011
    Messages : 3 179
    Points : 19 373
    Points
    19 373
    Par défaut


    Ton pattern est bon c'est le test qui ne l'est pas
    Regarde les valeurs de retour de la fonction preg_match().
    Avant toute chose : lire le mode d'emploi du forum et ses règles.
    Je ne réponds pas aux questions techniques en MP.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    530
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 530
    Points : 316
    Points
    316
    Par défaut
    Bonjour FirePrawn et merci de ta réponse,

    Je vais creuser cette piste :-)

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Alexdezark Voir le message
    ...D'une grande clairvoyance....
    Si tu relis mon message, tu verras qu'il ne s'adressait pas à toi.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    530
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 530
    Points : 316
    Points
    316
    Par défaut
    Je ne comprend pas, dans le tuto proposé par jreaux62 c'est bien preg_match qui est utilisé :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    <?php
     
    $patterns = array();
    $patterns[0][0] = "#^http$#";
    $patterns[0][1] = "#http$#";
    $patterns[0][2] = "#^http#";
    $patterns[1][0] = "#^.com/$#";
    $patterns[1][1] = "#.com/$#";
    $patterns[1][2] = "#^.com/#";
    $patterns[2][0] = "#^Guillaume Rossolini$#";
    $patterns[2][1] = "#Guillaume Rossolini$#";
    $patterns[2][2] = "#^Guillaume Rossolini#";
     
    $subjects = array();
    $subjects[] = "ftp://ftp.developpez.com/g-rossolini/";
    $subjects[] = "http://g-rossolini.developpez.com/";
    $subjects[] = "http://www.developpez.com/";
    $subjects[] = "http://php.developpez.com/";
    $subjects[] = "Guillaume Rossolini";
    $subjects[] = "0123456789";
    $subjects[] = "01 23 45 67 89";
     
    foreach($patterns as $pattern)
    {
        echo "Où se trouve <strong>".trim($pattern[0], '#^$')."</strong> ?<br /><ul>";
        foreach($subjects as $subject)
        {
            echo "<li>dans <strong>$subject</strong> ?<br />";
            if(preg_match($pattern[0], $subject))
            {
                echo "C'est la chaîne complète";
            }
            elseif(preg_match($pattern[1], $subject))
            {
                echo "À la fin";
            }
            elseif(preg_match($pattern[2], $subject))
            {
                echo "Au début";
            }
            else
            {
                echo "Nulle part";
            }
            echo "</li>";
        }
        echo "</ul>";
    }
     
    ?>
    sans doute y-a-t-il quelque chose de différent de ma manière de l'utiliser mais je ne comprend pas quoi

    Car si j'utilise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(strpos($subject, $pattern) === (strlen($subject) - strlen($pattern))
    Je ne comprend pas l'interet d'utiliser l'ancrage de fin ($)

    Merci de m'éclairer un peu

    @jreaux : excuses-moi, c'est vrai que cette réponse rapide m'avait un peu surpris, en relisant je comprend ce que tu veux dire, mais sans doute bob633 était-il en train de rédiger sa réponse en même temps que toi et que vos réponses se sont croisées .

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    530
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 530
    Points : 316
    Points
    316
    Par défaut
    ça y est j'ai compris !

    l'expression régulière ET l'utilisation de preg_match sont justes, ce qui ne l'est pas c'est mon traitement préalable des noms de fichiers.

    En effet, je travaille sur un répertoire contenant des fichiers qui m'ont été fournis et ce à quoi je ne m'attendais pas c'est que parmi ces fichiers il y en a qui comportent des points dans leur nom et qu'il ne s'agit pas de celui séparant le nom de fichier de son extension...

    donc quand je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach($tabImg as $num => $img){
    	$tab = explode(".", $img);
    	if(preg_match('#[0-9]\z#', $tab[0])) echo $img."<br />";
    };
    le tableau ($tab) peut contenir plus de 2 éléments et de ce fait $tab[0] n'est pas le nom de fichier complet mais juste une partie.

    Donc quand la regex trouve le fichier :

    2013_06_TOY-MACHINE-DECK-8.25-TEMPLETON-ELEPHANT-PAR.jpg

    on voit que la partie avant le PREMIER point se termine bien par un chiffre...

    pour résoudre ce problème je peux faire comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(ereg('[0-9]$', $tab[count($tab)-2]))
    Mais je vais quand même plutôt chercher à remplacer les points "injustifiés" avant de faire ce traitement.

    Je mets donc le tag "résolu"
    Merci pour votre aide

  11. #11
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pathinfo($file, PATHINFO_FILENAME);
    devrait te retourner le nom de fichier correct sans l'extension qu'il contienne des points ou non

    Les fonctions ereg* sont dépréciées et donc à éviter
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    530
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 530
    Points : 316
    Points
    316
    Par défaut
    Merci de ta réponse Grunk,

    Cette fonction marche parfaitement merci.
    Maintenant que je me suis aperçu que les noms de fichiers comportent des points, je pense préférable de les modifier (en les remplaçant par un tiret) et cette fonction va bien m'aider en m'évitant des manips de tableaux avec explode.

    Et pour revenir à mon expression régulière, désolé, je n'ai pas copié / collé la bonne car j'ai fait plusieurs tests avant de comprendre ce qui ne marchait pas.

    J'utilise en définitive :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(preg_match('#-[0-9]{1,3}$#', $nomFichier))
    Vu toutes les recherches que j'ai fait ce matin pour comprendre pourquoi ça ne marchait pas, je serai vraiment grave si je n'avais pas lu que "ereg" était dépréciée.

    Bonne journée et merci encore

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

Discussions similaires

  1. Vérifier si un mot se termine par un "e" et suivi d'un autre commencant par "e"
    Par cookizz dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 25/03/2009, 15h41
  2. Réponses: 5
    Dernier message: 26/08/2008, 16h00
  3. Récuperer div dont l'id se termine par une certaine chaine
    Par Kimado dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 04/04/2008, 16h20
  4. [regexp] Chaine qui se termine par
    Par cootchy dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 28/08/2007, 18h39
  5. Réponses: 10
    Dernier message: 24/02/2004, 12h28

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