Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/05/2007, 09h29   #1
Membre confirmé
 
Avatar de max44410
 
Étudiant
Inscription : juin 2003
Messages : 426
Détails du profil
Informations personnelles :
Âge : 29

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2003
Messages : 426
Points : 259
Points : 259
Envoyer un message via MSN à max44410 Envoyer un message via Skype™ à max44410
Par défaut [preg_match] une petite difficulté

Bonjour,


voila la ligne que je veux traiter :
Citation:
telnet 198.21.13.47 (login/ )
et des fois j'ai :
Citation:
telnet 198.21.13.47 (login/pwd)
ou bien :
Citation:
telnet 198.21.13.47 ()
Code :
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 :

Citation:
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
__________________
Venez voir par là...
max44410 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2007, 13h14   #2
Membre Expert
 
Homme
Inscription : janvier 2004
Messages : 1 238
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2004
Messages : 1 238
Points : 1 421
Points : 1 421
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 :
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 :
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
__________________
PHP :
Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production)
Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error());
Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable.
Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/
Fladnag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/05/2007, 02h30   #3
Membre confirmé
 
Avatar de max44410
 
Étudiant
Inscription : juin 2003
Messages : 426
Détails du profil
Informations personnelles :
Âge : 29

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2003
Messages : 426
Points : 259
Points : 259
Envoyer un message via MSN à max44410 Envoyer un message via Skype™ à max44410
Très fort ... ahhh très très fort ....

Non ... bah voila c'est exactement ce que je voulais.
Juste une petite question :
Code :
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.
__________________
Venez voir par là...
max44410 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/05/2007, 06h09   #4
Membre Expert
 
Homme
Inscription : janvier 2004
Messages : 1 238
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2004
Messages : 1 238
Points : 1 421
Points : 1 421
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)
__________________
PHP :
Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production)
Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error());
Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable.
Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/
Fladnag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2007, 04h15   #5
Membre confirmé
 
Avatar de max44410
 
Étudiant
Inscription : juin 2003
Messages : 426
Détails du profil
Informations personnelles :
Âge : 29

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2003
Messages : 426
Points : 259
Points : 259
Envoyer un message via MSN à max44410 Envoyer un message via Skype™ à max44410
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 :
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
__________________
Venez voir par là...
max44410 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2007, 06h06   #6
Membre Expert
 
Homme
Inscription : janvier 2004
Messages : 1 238
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2004
Messages : 1 238
Points : 1 421
Points : 1 421
il te manque le ? juste apres la parenthese non capturante je pense
__________________
PHP :
Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production)
Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error());
Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable.
Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/
Fladnag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2007, 09h05   #7
Membre confirmé
 
Avatar de max44410
 
Étudiant
Inscription : juin 2003
Messages : 426
Détails du profil
Informations personnelles :
Âge : 29

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2003
Messages : 426
Points : 259
Points : 259
Envoyer un message via MSN à max44410 Envoyer un message via Skype™ à max44410
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 :

Citation:
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 :
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);
__________________
Venez voir par là...
max44410 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2007, 09h18   #8
Membre Expert
 
Homme
Inscription : janvier 2004
Messages : 1 238
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2004
Messages : 1 238
Points : 1 421
Points : 1 421
a premiere vue, je remplacerais deja :
Code :
(ssh|telnet|sudo)(?: su - | -l )?
par
Code :
(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 !
__________________
PHP :
Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production)
Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error());
Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable.
Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/
Fladnag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2007, 10h52   #9
Membre expérimenté
 
Étudiant
Inscription : juillet 2004
Messages : 777
Détails du profil
Informations personnelles :
Âge : 25

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2004
Messages : 777
Points : 527
Points : 527
C'est quoi le ':' ?
cerede2000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2007, 10h59   #10
Membre confirmé
 
Avatar de max44410
 
Étudiant
Inscription : juin 2003
Messages : 426
Détails du profil
Informations personnelles :
Âge : 29

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2003
Messages : 426
Points : 259
Points : 259
Envoyer un message via MSN à max44410 Envoyer un message via Skype™ à max44410
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 :
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 ...

Citation:
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
__________________
Venez voir par là...
max44410 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2007, 11h19   #11
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Citation:
Envoyé par cerede2000
C'est quoi le ':' ?
(?: ... ) parenthèse non capturante. Le ':' seul n'a aucune signification.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2007, 11h52   #12
Membre Expert
 
Homme
Inscription : janvier 2004
Messages : 1 238
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2004
Messages : 1 238
Points : 1 421
Points : 1 421
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 :
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;
}
__________________
PHP :
Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production)
Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error());
Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable.
Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/
Fladnag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2007, 13h21   #13
Membre chevronné
 
Avatar de Korko Fain
 
Étudiant
Inscription : août 2005
Messages : 632
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2005
Messages : 632
Points : 632
Points : 632
Pfiou
Code php :
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 :
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.
Korko Fain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2007, 13h33   #14
Membre Expert
 
Homme
Inscription : janvier 2004
Messages : 1 238
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2004
Messages : 1 238
Points : 1 421
Points : 1 421
Ma solution ;o)

y a beaucoup de code, mais c'est essentiellement de l'affichage.
La regexp est là :
Code :
1
2
$ip='\d+\.\d+\.\d+\.\d+';
$pattern='#(telnet|ssh|sudo)(?: -l| su -)? (\w+|'.$ip.')[ /](\w+|'.$ip.')? ?\((\w+)?/?(?:(\w+)?|\s*)\).*#';
ce qui donne :
Code :
#(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 :
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>
__________________
PHP :
Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production)
Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error());
Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable.
Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/
Fladnag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2007, 13h41   #15
Membre chevronné
 
Avatar de Korko Fain
 
Étudiant
Inscription : août 2005
Messages : 632
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2005
Messages : 632
Points : 632
Points : 632
mouai "telnet su -" c'est pas tres bon comme syntaxe et pourtant c'est valide dans ta regex :p
Korko Fain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2007, 15h37   #16
Membre Expert
 
Homme
Inscription : janvier 2004
Messages : 1 238
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2004
Messages : 1 238
Points : 1 421
Points : 1 421
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)
__________________
PHP :
Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production)
Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error());
Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable.
Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/
Fladnag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2007, 16h54   #17
Membre Expert
 
Homme
Inscription : janvier 2004
Messages : 1 238
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2004
Messages : 1 238
Points : 1 421
Points : 1 421
bon, voila la derniere version... c'est évolutif, et ca remonte les infos sous forme de tableau :

Code :
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 :
Citation:
* 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
__________________
PHP :
Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production)
Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error());
Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable.
Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/
Fladnag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2007, 02h14   #18
Membre confirmé
 
Avatar de max44410
 
Étudiant
Inscription : juin 2003
Messages : 426
Détails du profil
Informations personnelles :
Âge : 29

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2003
Messages : 426
Points : 259
Points : 259
Envoyer un message via MSN à max44410 Envoyer un message via Skype™ à max44410
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.
__________________
Venez voir par là...
max44410 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h40.


 
 
 
 
Partenaires

Hébergement Web