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 :

[preg_match] une petite difficulté [RegEx]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de max44410
    Étudiant
    Inscrit en
    Juin 2003
    Messages
    426
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2003
    Messages : 426
    Par défaut [preg_match] une petite difficulté
    Bonjour,


    voila la ligne que je veux traiter :
    telnet 198.21.13.47 (login/ )
    et des fois j'ai :
    telnet 198.21.13.47 (login/pwd)
    ou bien :
    telnet 198.21.13.47 ()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    if (preg_match("/telnet (\d+\.\d+\.\d+\.\d+) \((\S+)?\/?(\S+)?\).*/", trim($value2)))
    	{
    	echo " PWD ";
    	preg_match("/telnet (\d+\.\d+\.\d+\.\d+) \((\S+)?\/?(\S+)?\).*/", trim($value2) , $tabCon);
    	var_dump($tabCon);
    	}
    else
    	{
    	echo " BDL IP ";
    	preg_match("/telnet (\d+\.\d+\.\d+\.\d+)\/(\d+\.\d+\.\d+\.\d+).*/", trim($value2) , $tabCon);
    	var_dump($tabCon);
    	}
    il me retourne :

    BDL IP array(0) { }
    normalement il ne devrait pas passer dans le else ... je dois avoir une erreur dans mon expression mais je ne vois pas où.

    Merci

  2. #2
    Membre Expert

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Par défaut
    Ton message etait assez difficile a comprendre, tu n'indiques jamais ce que tu souhaites obtenir, meme si tu indiques deja ce que tu as en entrée.
    L'abreviation "BDL IP" reste un mystère total... En gros tu "obliges" quiconque souhaitant t'aider a executer ton code pour trouver ce qui ne va pas... pas bien... mais je suis gentil aujourd'hui, et je l'ai fait :

    Deja tu fais 3 preg_match là ou un seul suffit, c'est pas top pour les perf, preg_match étant l'une des methodes les plus consommatrices de CPU.

    Ensuite, le \S+ consomme (ou match) le slash (\) dans la forme login\pass. Si tu veux eviter cela : Soit tu spécifie l'option de recherche U (ungreedy) a la fin du masque, soit tu utilise \w (word) au lieu de \S. Je prefere la 2eme methode, mais ca depend de ton format de password (si les caracteres spéciaux sont autorisés)

    Enfin, pour accroitre la lisibilité, je te déconseille d'utiliser / comme caractere de debut et de fin d'expression reguliere. En effet, ca t'oblige a les echapper s'ils apparaissent dans ta chaine. C'est pourquoi je prefere en général utiliser #.

    Ci dessous, un code fonctionnel qui récupere toutes les infos avec une seule expression reguliere. J'ai utilisé \w et une parenthese non capturante (?:...) afin de gerer le cas de "le mot de passe est un espace" qui est le cas de test que tu as proposé. Si le cas "telnet... (login/ )" n'arrive jamais, mais que le cas "telnet... (login/)" peut se produire, la parenthese non capturante ne sert plus et on peut l'enlever.

    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
    <pre>
    <?php
     
    $liste=array(
    'telnet 198.21.13.47 (login/ )',
    'telnet 198.21.13.47 (login/pwd)',
    'telnet 198.21.13.47 ()',
    );
     
    foreach($liste as $value2) {
     
    //	if (preg_match("/telnet (\d+\.\d+\.\d+\.\d+) \((\S+)?\/?(\S+)?\).*/", trim($value2))) {
    //		echo " PWD ";
    //		preg_match("/telnet (\d+\.\d+\.\d+\.\d+) \((\S+)?\/?(\S+)?\).*/", trim($value2) , $tabCon);
    //		var_dump($tabCon);
    //	} else {
    //		echo " BDL IP ";
    //		preg_match("/telnet (\d+\.\d+\.\d+\.\d+)\/(\d+\.\d+\.\d+\.\d+).*/", trim($value2) , $tabCon);
    //		var_dump($tabCon);
    //	}
    //
    //	echo "<hr>";
     
    	preg_match('#telnet (\d+\.\d+\.\d+\.\d+) \((\w+)?/?(?:(\w+)?|\s*)\).*#', trim($value2) , $tabCon);
    	echo '<b><u>'.$value2.'</u> : ';
    	var_dump($tabCon);
    	echo '</b>';
     
    	@list(,$IP, $login, $pass) = $tabCon;
     
    	if (isset($pass)) {
    		echo '=> PWD';
    	} else {
    		echo '=> SANS PWD';
    	}
    	echo '<br>';
     
    }
     
    ?>
    </pre>
    Ce qui 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
    telnet 198.21.13.47 (login/ ) : array(3) {
      [0]=>
      string(29) "telnet 198.21.13.47 (login/ )"
      [1]=>
      string(12) "198.21.13.47"
      [2]=>
      string(5) "login"
    }
    => SANS PWD
    telnet 198.21.13.47 (login/pwd) : array(4) {
      [0]=>
      string(31) "telnet 198.21.13.47 (login/pwd)"
      [1]=>
      string(12) "198.21.13.47"
      [2]=>
      string(5) "login"
      [3]=>
      string(3) "pwd"
    }
    => PWD
    telnet 198.21.13.47 () : array(2) {
      [0]=>
      string(22) "telnet 198.21.13.47 ()"
      [1]=>
      string(12) "198.21.13.47"
    }
    => SANS PWD

  3. #3
    Membre éclairé Avatar de max44410
    Étudiant
    Inscrit en
    Juin 2003
    Messages
    426
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2003
    Messages : 426
    Par défaut
    Très fort ... ahhh très très fort ....

    Non ... bah voila c'est exactement ce que je voulais.
    Juste une petite question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    \((\w+)?/?(?:(\w+)?|\s*)\).*#
    Pourquoi tu mets un '?' ici, moi j'aurrais mis un '*'.

    Je ne savais pas pour les parentheses non capturanteC'est nikel, merci beacoup.

  4. #4
    Membre Expert

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Par défaut
    il y a deja un + derriere le \w donc pas besoin d'un * derriere la parenthese capturante. Le ? est issu de ton expression réguliere, afin de gerer le cas ou les champs ne sont pas renseignés (ici le pass)

  5. #5
    Membre éclairé Avatar de max44410
    Étudiant
    Inscrit en
    Juin 2003
    Messages
    426
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2003
    Messages : 426
    Par défaut
    pap palap ... j'avais oublier une possibilité ...

    telnet 100.0.0.1/100.0.2.3 (login/pwd)

    des fois j'ai deux IP. je veux prendre un compte que la premiere

    j'ai fait cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    preg_match("#telnet (\d+\.\d+\.\d+\.\d+)(?:/\d+\.\d+\.\d+\.\d+) \((\w+)?/?(?:(\w+)?|\s*)\).*#", trim($value2) , $tabCon);
    mais bien sur cela ne fonctionne pas...
    je dois avoir un peu de mal a gerer les parentheses non capturante

    Merci

  6. #6
    Membre Expert

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Par défaut
    il te manque le ? juste apres la parenthese non capturante je pense

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

Discussions similaires

  1. Une petite question de modélisation
    Par Emdis dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 28/10/2004, 13h13
  2. copier une petite texture sur une grosse texture
    Par gaut dans le forum DirectX
    Réponses: 5
    Dernier message: 15/10/2004, 23h12
  3. Une petite question
    Par Etienne1 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 10/08/2004, 17h19
  4. Réponses: 2
    Dernier message: 23/03/2004, 13h23
  5. Une petite aide pour les API ?
    Par Yop dans le forum Windows
    Réponses: 2
    Dernier message: 04/04/2002, 22h45

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