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

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2003
    Messages : 426
    Points : 301
    Points
    301
    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 expérimenté

    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
    Points : 1 565
    Points
    1 565
    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 averti Avatar de max44410
    Étudiant
    Inscrit en
    Juin 2003
    Messages
    426
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2003
    Messages : 426
    Points : 301
    Points
    301
    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 expérimenté

    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
    Points : 1 565
    Points
    1 565
    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 averti Avatar de max44410
    Étudiant
    Inscrit en
    Juin 2003
    Messages
    426
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2003
    Messages : 426
    Points : 301
    Points
    301
    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 expérimenté

    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
    Points : 1 565
    Points
    1 565
    Par défaut
    il te manque le ? juste apres la parenthese non capturante je pense

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2003
    Messages : 426
    Points : 301
    Points
    301
    Par défaut
    ok, je pense que j'avais une autre erreur car je ne récupérais pas vraiment ce que je voulais dans mon tableau de retour.

    bref, j'ai laissé tomber mon ancienne expression régulière pour en faire une seule qui gere plus de cas.

    les cas que je rencontre sont les suivants :

    telnet 100.0.0.1 (login/pass)
    telnet 100.0.0.1/100.11.0.1 (login/pass)
    ssh -l login 45.25.26.10 (pass)
    telnet hostname (login/pass)
    ssh -l login hostname (pass)
    sudo su - login (pass)
    je voudrais recupere l'action (telnet, ssh ou sudo), l'adresse IP (ou hostname)(la premiere adresse dans le cas ou il y en a deux), le login et le mot de passe.

    voila mon expression regulière, mais je ne récupère que des sudo:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if (preg_match("#(ssh|telnet|sudo)(?: su - | -l )?(\d+\.\d+\.\d+\.\d+|\w+)/?(?:\d+\.\d+\.\d+\.\d+)? \((\w+)?/?(?:(\w+)?|\s*)\).*#", $value2, $tab))
    	var_dump($tab);

  8. #8
    Membre expérimenté

    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
    Points : 1 565
    Points
    1 565
    Par défaut
    a premiere vue, je remplacerais deja :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (ssh|telnet|sudo)(?: su - | -l )?
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (ssh|telnet|sudo) (?:su - |-l )?
    car sinon il te manque l'espace apres telnet

    ensuite, la premiere plage de récuperation IP est obligatoire... alors qu'elle est inexistante dans le sudo, donc match impossible.

    En quelle version de PHP est tu ? si tu as PHP >= 4.3.3, tu peux nommer tes sous masques afin que le résultat soit plus lisible avec la syntaxe :
    (?P<name>pattern)

    Devant le nombre de possibilités que tu évoque, tu pourrais donc essayer de faire une expression réguliere de la forme :

    (?:possibilité 1|possibilite 2|possibilite 3|possibilite 4...)

    avec dans chaque possibilité un masque simple qui corresponde exactement a chacun des cas de figures. L'idée est de nommer les patterns matchés en les appelant "commande", "IP", "login", "pass" pour qu'ils puissent etre accessibles de la meme maniere quelque soit la commande matchés. (parce que sinon, le 1er masque du su sera le login alors que le 1er masque du telnet sera l'IP)

    pour développer ca, je te conseille d'ajouter les masques petit a petit, un par un. Je verrais si je peux t'aider plus entre midi et deux, là faut que je bosse un peu ;o)))

    Edit : ca ne marche pas, on ne peux pas avoir deux masques avec le meme nom dans la meme regexp... meme s'il est impossible de matcher les deux a la fois... dommage ;o) va donc falloir faire un truc illisibile avec des ? partout !

  9. #9
    Membre expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Points : 3 338
    Points
    3 338
    Par défaut
    C'est quoi le ':' ?

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2003
    Messages : 426
    Points : 301
    Points
    301
    Par défaut
    bon j'ai bossé de mon coté pendant un bonne heure ...
    (PHP v4.3.7 de mémoire)

    voila ce que j'ai maintenant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    preg_match("#(ssh|telnet|sudo) (?:su - (\w+)|-l (\w+))?(?:(\d+\.\d+\.\d+\.\d+|\w+)?/?(?:\d+\.\d+\.\d+\.\d+)?)?(\w+)?\s\((\w+)?/?(?:(\w+)?|\s*)\).*#", $value2, $tab)
    et avec ca je match presque tout ...

    telnet 100.0.0.1 (login/pass)
    telnet 100.0.0.1/100.11.0.1 (login/pass)
    ssh -l login 45.25.26.10 (pass)
    telnet hostname (login/pass)
    ssh -l login hostname (pass)
    sudo su - login (pass)
    sauf les ssh

  11. #11
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Citation Envoyé par cerede2000
    C'est quoi le ':' ?
    (?: ... ) parenthèse non capturante. Le ':' seul n'a aucune signification.

  12. #12
    Membre expérimenté

    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
    Points : 1 565
    Points
    1 565
    Par défaut
    sauf que là tu match aussi "telnet su - ..."
    si ca te dérange pas ok... mais sinon, apres quelques tests, j'arrive pas a trouver d'autre solution que d'utiliser 3 regexp (une pour chaque commande)

    vu le nombre de possibilités a matcher, tu auras de toute facon une "normalisation" a effectuer apres du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    switch($commande) {
      case 'telnet':
        $IP=$result[1];
        ...
      break;
      case 'ssh':
        $IP=$result[2];
        ...
      break;
      case 'sudo':
        $login=$result[1];
        ...
      break;
    }

  13. #13
    Membre éclairé Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Points : 718
    Points
    718
    Par défaut
    Pfiou
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all('#(?:(telnet) (?:((?:\d+\.\d+\.\d+\.\d+)|\w+)/?)+ \((\w*)/?(\w*) ?\))|(?:(ssh) -l (\w+) (?:((?:\d+\.\d+\.\d+\.\d+)|\w+)) \((\w+)\))|(?:(sudo) su - (\w+) \((\w+)\))#', $texte, $matches, PREG_SET_ORDER);

    Testé sur http://www.lumadis.be/regex/test_regex.php
    avec comme texte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    telnet 100.0.0.1 (login/pass)
    telnet 100.0.0.1/100.11.0.1 (login/pass)
    ssh -l login 45.25.26.10 (pass)
    telnet hostname (login/pass)
    ssh -l login hostname (pass)
    sudo su - login (pass)
    telnet 198.21.13.47 (login/ )
    telnet 198.21.13.47 ()
    Seul probleme : Quand tu entres 2 IP dans ton telnet, il ne prend en compte que la 2eme aparemment.

  14. #14
    Membre expérimenté

    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
    Points : 1 565
    Points
    1 565
    Par défaut
    Ma solution ;o)

    y a beaucoup de code, mais c'est essentiellement de l'affichage.
    La regexp est là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ip='\d+\.\d+\.\d+\.\d+';
    $pattern='#(telnet|ssh|sudo)(?: -l| su -)? (\w+|'.$ip.')[ /](\w+|'.$ip.')? ?\((\w+)?/?(?:(\w+)?|\s*)\).*#';
    ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #(telnet|ssh|sudo)(?: -l| su -)? (\w+|\d+\.\d+\.\d+\.\d+)[ /](\w+|\d+\.\d+\.\d+\.\d+)? ?\((\w+)?/?(?:(\w+)?|\s*)\).*#
    (j'ai sorti la regexp qui match une ip pour la rendre plus lisible et aussi parce que j'en avais besoin apres)

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    <pre>
    <?php
     
    $liste=array(
    'telnet 100.0.0.1 (login/pass)',
    'telnet 100.0.0.1/100.11.0.1 (login/pass)',
    'ssh -l login 45.25.26.10 (pass)',
    'telnet hostname (login/pass)',
    'ssh -l login hostname (pass)',
    'sudo su - login (pass)',
    'telnet 198.21.13.47 (login/ )',
    'telnet 198.21.13.47 ()',
    );
     
    $ip='\d+\.\d+\.\d+\.\d+';
    $pattern='#(telnet|ssh|sudo)(?: -l| su -)? (\w+|'.$ip.')[ /](\w+|'.$ip.')? ?\((\w+)?/?(?:(\w+)?|\s*)\).*#';
    echo htmlentities($pattern).'<br>';
    foreach($liste as $test) {
     
    	preg_match($pattern, trim($test) , $results);
    	echo '<b>*&nbsp;Test : <u>'.htmlentities($test).'</u></b><br>';
    //	var_dump($results);
    	array_shift($results); // on vire le masque entier
     
    	$aff=array('commande','IP','IP2','hostname','login','pass');
    	foreach($aff as $champ) $$champ='';
     
    	$commande=array_shift($results);
    	@list($param1, $param2)=$results;
    	if (!empty($param1)) {
    		if (preg_match('#'.$ip.'#', $param1) === 1) {
    			$IP=$param1;
    		} else {
    			$hostname=$param1;
    		}
    	}
    	if (!empty($param2)) {
    		if (preg_match('#'.$ip.'#', $param2) === 1) {
    			$IP2=$param2;
    		} else {
    			$hostname=$param2;
    		}
    	}
     
    	if (empty($IP) && !empty($IP2)) {
    		$IP=$IP2;
    		$IP2='';
    	}
     
    	switch($commande) {
    		case 'telnet':
    			@list(,,$login,$pass)=$results;
    		break;
    		case 'ssh':
    			@list($login,,$pass)=$results;
    			if (!empty($IP)) $hostname='';
    		break;
    		case 'sudo':
    			@list($login,,$pass,$hostname)=$results;
    		break;
    	}
     
    	echo '<table border=1>';
    	echo '<tr><td>'.implode('</td><td>', $aff).'</td></tr>';
    	echo '<tr>';
    	foreach($aff as $champ) {
    		echo '<td>'.$$champ.'</td>';
    	}
    	echo '</tr></table>';
    	echo '<br><br>';
    }
    ?>
    </pre>

  15. #15
    Membre éclairé Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Points : 718
    Points
    718
    Par défaut
    mouai "telnet su -" c'est pas tres bon comme syntaxe et pourtant c'est valide dans ta regex :p

  16. #16
    Membre expérimenté

    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
    Points : 1 565
    Points
    1 565
    Par défaut
    je sais je sais...
    mais ca depend de la source des données... ca ressemble a un log, peut etre que les erreurs sont logés ailleurs ou sous une forme différente, je sais pas...

    et puis ce qui me dérange dans ta regexp (que j'ai testé ;o) c'est que ca reste embettant a récuperer. En fait, chaque parenthese capturante est stockée dans un indice différent du tableau de resultat, tu as donc un tableau tres partiellement rempli a chaque fois... je voulais éviter ca ;o)

  17. #17
    Membre expérimenté

    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
    Points : 1 565
    Points
    1 565
    Par défaut
    bon, voila la derniere version... c'est évolutif, et ca remonte les infos sous forme de tableau :

    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
    51
    52
    53
    54
    55
    56
    57
    <pre>
    <?php
     
    $liste=array(
    'telnet 100.0.0.1 (login/pass)',
    'telnet 100.0.0.1/100.11.0.1 (login/pass)',
    'telnet 198.21.13.47 (login/ )',
    'telnet 198.21.13.47 ()',
    'telnet hostname (login/pass)',
    'ssh -l login 45.25.26.10 (pass)',
    'ssh -l login hostname (pass)',
    'sudo su - login (pass)',
    );
     
    $ip='\d+\.\d+\.\d+\.\d+';
    $pattern=array(
    	'telnet'=>'(?P<telnet>telnet) (?:(?P<telnet_IP>'.$ip.')(?:/(?P<telnet_IP2>'.$ip.'))?|(?P<telnet_hostname>\w+)) \((?:(?P<telnet_login>\w+)/(?:\s+|(?P<telnet_pass>\w+)))?\)',
    	'ssh'=>'(?P<ssh>ssh) -l (?P<ssh_login>\w+) (?:(?P<ssh_IP>'.$ip.')|(?P<ssh_hostname>\w+)) \((?P<ssh_pass>\w+)\)',
    	'sudo'=>'(?P<sudo>sudo) su - (?P<sudo_login>\w+) \((?P<sudo_pass>\w+)\)',
    );
     
    $pattern='#(?:'.implode('|',$pattern).').*#';
    echo htmlentities($pattern).'<br>';
    foreach($liste as $test) {
     
    	$data=array();
    	preg_match($pattern, trim($test) , $results);
    	echo '<b>*&nbsp;Test : <u>'.htmlentities($test).'</u></b><br>';
     
    	foreach($results as $key=>$value) {
    		if (!is_numeric($key) && !empty($value)) {
    			unset($element);
    			@list($commande, $element)=explode('_',$key);
    			if (!isset($data[$commande])) {
    				$data[$commande]=array();
    			}
    			if (isset($element)) {
    				$data[$commande][$element]=$value;
    			}
    		}
    	}
     
    	foreach($data as $commande=>$listeElement) {
    		echo '<table border=1>';
    		echo '<tr><td colspan='.count($listeElement).'>'.$commande.'</td></tr>';
    		echo '<tr>';
    		foreach($listeElement as $element=>$value) {
    			echo '<td>'.$element.'</td>';
    		}
    		echo '</tr>';
    		echo '<tr><td>'.implode('</td><td>', $listeElement).'</td></tr>';
    		echo '</table>';
    	}
    	echo '<br><br>';
    }
    ?>
    </pre>
    ce qui affiche :
    * Test : telnet 100.0.0.1 (login/pass)
    telnet
    IP login pass
    100.0.0.1 login pass


    * Test : telnet 100.0.0.1/100.11.0.1 (login/pass)
    telnet
    IP IP2 login pass
    100.0.0.1 100.11.0.1 login pass


    * Test : telnet 198.21.13.47 (login/ )
    telnet
    IP login
    198.21.13.47 login


    * Test : telnet 198.21.13.47 ()
    telnet
    IP
    198.21.13.47


    * Test : telnet hostname (login/pass)
    telnet
    hostname login pass
    hostname login pass


    * Test : ssh -l login 45.25.26.10 (pass)
    ssh
    login IP pass
    login 45.25.26.10 pass


    * Test : ssh -l login hostname (pass)
    ssh
    login hostname pass
    login hostname pass


    * Test : sudo su - login (pass)
    sudo
    login pass
    login pass

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2003
    Messages : 426
    Points : 301
    Points
    301
    Par défaut
    Et bien merci les gars... vous vous êtes bien lachés sur mon problème ... j'apprécis !!
    Que de solution, j'ai plus qu'à faire le choix.

    pour info, je n'ai jamais de "telnet su -", c'est un fichier a peu près normalisé.

    Merci encore, bonne journée.

+ 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