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 :

regex sur les x premiers chiffres [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Points : 118
    Points
    118
    Par défaut regex sur les x premiers chiffres
    j'ai un fichier txt avec en ligne
    123456
    123
    1234
    1234567
    123.4567
    j'aimerais recupérer que les lignes commencant par soit 4 soit 5 chiffres
    j'ai un code comme ceci
    ([0-9\.]){4}
    mais je ne sais pas comment on peut faire
    merci pour votre aide

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 233
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 233
    Points : 15 526
    Points
    15 526
    Par défaut
    pour lire le contenu du fichier, vous avez cette fonction :
    https://secure.php.net/manual/fr/fun...t-contents.php

    et ensuite pour trouver les nombres essayez ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $texte = "123456
    123
    1234
    du texte
    1234567
    123.4567
    ";
     
    preg_match_all("/^([0-9.]{1,5})$/m", $texte, $resultats);

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Points : 118
    Points
    118
    Par défaut
    tester ton code sur http://www.phpliveregex.com mais ca ne marche pas
    Nom : 1.jpg
Affichages : 1133
Taille : 100,0 Ko

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu n'as pas de ligne avec 5 chiffres
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Points : 118
    Points
    118
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Tu n'as pas de ligne avec 5 chiffres
    et la ligne 1234567 c'est bien plus que 5 chiffres

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu as dit 4 et 5, pas 4 et plus.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Points : 118
    Points
    118
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Tu as dit 4 et 5, pas 4 et plus.
    quand la ligne a 4 chiffres je recupre .quand la ligne a 5 lettre je recupere.je ne sais pas comment coder çà

  8. #8
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Et quand il y en a 6 ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Points : 118
    Points
    118
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Et quand il y en a 6 ?
    s'il y a 6 chiffres je ne prends pas

  10. #10
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Essaie ça.

    Code php : 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
     
    <?php
    $texte ="
     666666
     333
     4444
     55555
     7777777
     888.8888
     1111.111
     22222.2222";
     
     $pattern = "/(?<!\.)\b(\d{4,5}(\.\d+){0,1})\b/m"; 
     
     preg_match_all($pattern, $texte, $resultats);
     var_dump($resultats);

    Donne :

    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
     
    array(3) {
      [0]=>
      array(4) {
        [0]=>
        string(4) "4444"
        [1]=>
        string(5) "55555"
        [2]=>
        string(8) "1111.111"
        [3]=>
        string(10) "22222.2222"
      }
      [1]=>
      array(4) {
        [0]=>
        string(4) "4444"
        [1]=>
        string(5) "55555"
        [2]=>
        string(8) "1111.111"
        [3]=>
        string(10) "22222.2222"
      }
      [2]=>
      array(4) {
        [0]=>
        string(0) ""
        [1]=>
        string(0) ""
        [2]=>
        string(4) ".111"
        [3]=>
        string(5) ".2222"
      }
    }
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  11. #11
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Alors tu prends 6 mais pas 7 ?
    Par ce que tu voulais prendre 1234567.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  12. #12
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Comme ça.
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all("/^[0-9]{4,5}(?:[^0-9].*)?$/m", $texte, $resultats);

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Points : 118
    Points
    118
    Par défaut
    Citation Envoyé par tsuji Voir le message
    Comme ça.
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all("/^[0-9]{4,5}(?:[^0-9].*)?$/m", $texte, $resultats);
    en faisant simplement comme celà
    preg_match_all("/^[0-9]{4,5}/m", $input_lines, $output_array);
    ca donne bien
    array(10=>array(60=>66666 1=>4444 2=>55555 3=>77777 4=>1111 5=>22222))
    ca qui me semble pas mal .c'est ce que je cherche mais j'ai pas bien compris cette instruction .c'est soit 4 ou 5 / ou de 4 à 5 chiffres?
    {4,5}

  14. #14
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    @bigs3232

    Tes spécifications ne sont pas claires.

    s'il y a 6 chiffres je ne prends pas
    Or si tu as pris mon exemple, dans le résultat que tu postes
    preg_match_all("/^[0-9]{4,5}/m", $input_lines, $output_array);
    ca donne bien

    array(10=>array(60=>66666 1=>4444 2=>55555 3=>77777 4=>1111 5=>22222))


    666666 est pris, tout comme 7777777 et ils ont respectivement 6 et 7 chiffres !

    Pour ma part, j'avais compris "qui ont 4 ou 5 chiffres".
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  15. #15
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    {4,5} dit matcher au minumum 4 et au maximum 5. Puisque le pattern se comporte avec avidité, si il y a 5, il va matcher 5.

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Points : 118
    Points
    118
    Par défaut
    merci badaze .ton code est bien trop compliqué pour moi mais celui à tsuji me semble plus facile à comprendre .ceci dit j'ai pas compris ce code de tsuji.
    (?:[^0-9].*)?
    si tu peux nous apporter un peu de ta lumière

  17. #17
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Le sous-pattern : (?:[^0-9].*)?

    [1] (?...) signifie les sous-matches de par le pattern dedans (sous-pattern) ne serait pas capturé. La différence peut se voir par exemple via print_r($resultats)

    [1.1] sans (Array[1] contient les "submatches")
    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
    Array
    (
        [0] => Array
            (
                [0] => 1234xxxxx
                [1] => 98765yyyy
                etc...
            )
        [1] => Array
            (
                [0] => xxxxx
                [1] => yyyy
                etc...
            )
    )
    [1.2] avec (Array[1] se fait disparaître)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Array
    (
        [0] => Array
            (
                [0] => 1234xxxxx
                [1] => 98765yyyy
                etc...
            )
    )
    [2] [^0-9].*

    [2.1] La première partie [^0-9] se dit tout caratère sauf (une négation) les numériques 0 à 9. Faites attention qu'elle n'est qualifiée par ?. Il faut avoir matché un si c'est réussir. C'est le garant que la ligne commence seulement les numériques 4 à 5 comptes et pas plus et puis après au moins un non-numérique.

    [2.2] La deuxième partie .* va matcher tout le reste jusqu'à la fin de la ligne pour l'option m (/m) multi-ligne.

    [3] (?...)?
    La marque d'interrogation à la fin tient en compte qu'il se peut qu'on trouve immédiatement la fin de ligne ($) sans rien après les 4 ou 5 numériques.

    Voilà tout.

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Points : 118
    Points
    118
    Par défaut
    merci tsuji pour tes longues explications

  19. #19
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Citation Envoyé par bigs3232 Voir le message
    merci badaze .ton code est bien trop compliqué pour moi ....
    Compliqué ou pas, l'important est qu'il fonctionne. Est-ce qu'il fonctionne ?
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  20. #20
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Points : 118
    Points
    118
    Par défaut
    Citation Envoyé par badaze Voir le message
    Compliqué ou pas, l'important est qu'il fonctionne. Est-ce qu'il fonctionne ?
    oui ca fonctionnne mais j'aime bien comprendre le code .si je ne comprends pas je l'utilise pas meme s'il fonctionne

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [RegEx] Regex sur les 3 premiers caractères d'une chaine
    Par boo64 dans le forum Langage
    Réponses: 6
    Dernier message: 01/02/2011, 09h10
  2. Réponses: 5
    Dernier message: 24/01/2006, 14h25
  3. Réponses: 8
    Dernier message: 02/11/2005, 14h16
  4. Réponses: 24
    Dernier message: 27/09/2005, 21h16
  5. Connaitre les deux premier chiffres d'un input
    Par PrinceMaster77 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 03/01/2005, 16h50

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