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 pour IP et code pays [RegEx]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de goldkey
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 802
    Par défaut Regex pour IP et code pays
    Bonjour à tous,

    Voici typiquement 2 lignes sur lesquels je dois appliquer ma fonction regex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    2009-01-15 11:17:26,700 WARNING [ssh] Ban 81.51.110.57 FR, France
    2009-01-15 11:27:27,683 WARNING [ssh] Unban 81.51.110.57
    Mon but final sera, dans le cas ou la ligne contient "Ban", d'extraire le nom du protocole (ici -> ssh), l'adresse IP et le code du pays (ici -> FR).

    N'étant vraiment pas très doué en regex voila les patterns que j'ai trouvé sur le Web pour m'aider à débuter:

    - pattern A : pour récupérer l'adresse IP
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $patternA = '/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/';
    - pattern B : pour récupérer le code pays
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $patternB  = '/\b(BE|DE|CH|AT|FR)\b/';
    Maintenant j'aimerai fusionner les 2 patterns afin que je puisse récupérer l'adresse IP et le code pays avec un seul pattern.

    Ci-dessous un exemple que j'ai testé, inspiré du cours de Guillaume sur les regex:

    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
    //pour l'instant je test qu'avec la ligne qui m'intéresse
    $line = "2009-01-15 11:37:04,794 WARNING [ssh] Ban 81.51.110.57 FR, France";
     
    $patternA = '/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/';
    $patternB  = '/\b(BE|DE|CH|AT|FR)\b/';
    $patternAB = '/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b.\b(DE|CH|AT|FR)\b/';
    $matches = array();
    echo "<li><strong>$line</strong> ?<br />";
    if(preg_match_all($patternAB, $line, $matches, PREG_SET_ORDER)){
            echo "Oui :<br /><pre>";
            print_r($matches);
            echo "</pre>";
    }else{
            echo "Non";
    }
    echo "</li>";
    echo "</ul>";
    Malheureusement ma fusion des 2 patterns initiaux n'est pas satisfaisante.
    En effet voici le résultats que j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Array
    (
        [0] => Array
            (
                [0] => 81.51.110.57 FR
                [1] => FR
            )
     
    )
    Alors qu'à ce stade j'aimerai obtenir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Array
    (
        [0] => Array
            (
                [0] => 81.51.110.57
                [1] => FR
            )
     
    )
    Quelqu'un aurait-il une solution pour moi, car je ne m'en sort plus avec tous ces opérateurs

  2. #2
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Salut,

    Il manquait juste une paire de parenthèses
    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
     
    <?php
    //pour l'instant je test qu'avec la ligne qui m'intéresse
    $line = "2009-01-15 11:37:04,794 WARNING [ssh] Ban 81.51.110.57 FR, France";
     
    $patternA = '/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/';
    $patternB  = '/\b(BE|DE|CH|AT|FR)\b/';
    $patternAB = '/\b((?:[0-9]{1,3}\.){3}[0-9]{1,3})\b\s+\b(DE|CH|AT|FR)\b/';
    $matches = array();
    echo "<li><strong>$line</strong> ?<br />";
    if(preg_match_all($patternAB, $line, $matches, PREG_SET_ORDER)){
            echo "Oui :<br /><pre>";
            print_r($matches);
            echo "</pre>";
    }else{
            echo "Non";
    }
    echo "</li>";
    echo "</ul>";

  3. #3
    Membre émérite
    Avatar de goldkey
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 802
    Par défaut
    Merci pour ta réponse rapide jml94

    Seulement quand je teste le code en ajoutant les 2 parenthèses voila ce que j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Array
    (
        [0] => Array
            (
                [0] => 81.51.110.57 FR
                [1] => 81.51.110.57
                [2] => FR
            )
     
    )
    Alors que j'aimerai obtenir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Array
    (
        [0] => Array
            (
                [0] => 81.51.110.57
                [1] => FR
            )
     
    )
    Sinon aurais-tu une idée sur comment je pourrais extraire le type de protocole (dans mon exemple -> ssh) indiqué entre []

  4. #4
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Tu ne le sais pas, mais tu veux obtenir le premier tableau.

    L'indice zéro est la chaîne entière qui est reconnue par l'expression, et les autres indices sont pour les captures.

  5. #5
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Un code plus complet :
    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
     
    <?php
    //pour l'instant je test qu'avec la ligne qui m'intéresse
    $line = "2009-01-15 11:37:04,794 WARNING [ssh] Ban 81.51.110.57 FR, France";
     
    $patternIsBanned = '#\bWARNING\b\s+\[([^\]]++)\]\s+\bBan\b#';
    $patternInfos = '#\b((?:[0-9]{1,3}\.){3}[0-9]{1,3})\b\s+\b(DE|CH|AT|FR)\b#';
     
    echo "<h3>$line</h3>";
     
    if (preg_match($patternIsBanned, $line, $matches)) {
        $protocol = $matches[1];
        preg_match($patternInfos, $line, $matches);
        printf ("BANNI : ip=%s, pays=%s, proto=%s", $matches[1], $matches[2], $protocol);
    }

  6. #6
    Membre émérite
    Avatar de goldkey
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 802
    Par défaut
    Ouaaaa la classe

    Tu m'as prémaché tout le boulot

    Je vais bien étudié ca....en tout cas merci BEAUCOUP

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

Discussions similaires

  1. Regex pour capturer du code
    Par Molos dans le forum Général Python
    Réponses: 1
    Dernier message: 25/11/2011, 07h57
  2. [Débutant] Code tcl regex pour créer un jeu
    Par snip74 dans le forum Tcl/Tk
    Réponses: 3
    Dernier message: 19/01/2011, 17h15
  3. Bibliothèque regex pour code::blocks?
    Par halpha45 dans le forum Bibliothèques, systèmes et outils
    Réponses: 4
    Dernier message: 23/12/2010, 23h23
  4. [RegEx] regex pour supprimer l'indentation du code
    Par cassy dans le forum Langage
    Réponses: 7
    Dernier message: 27/08/2007, 14h02
  5. Réponses: 5
    Dernier message: 10/07/2006, 15h02

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