|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||
|
Membre confirmé
![]() |
Bonjour,
voila la ligne que je veux traiter : Citation:
Citation:
Citation:
Code :
Citation:
Merci
__________________
Venez voir par là... |
||||||
|
|
00
|
|
|
#2 | ||||
|
Membre Expert
![]() ![]() Inscription : janvier 2004 Messages : 1 238 ![]() |
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 :
Code :
__________________
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/ |
||||
|
|
00
|
|
|
#3 |
|
Membre confirmé
![]() |
Très fort ... ahhh très très fort ....
Non ... bah voila c'est exactement ce que je voulais. Juste une petite question : 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à... |
|
|
00
|
|
|
#4 |
|
Membre Expert
![]() ![]() Inscription : janvier 2004 Messages : 1 238 ![]() |
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/ |
|
|
00
|
|
|
#5 | ||
|
Membre confirmé
![]() |
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 :
je dois avoir un peu de mal a gerer les parentheses non capturante Merci
__________________
Venez voir par là... |
||
|
|
00
|
|
|
#6 |
|
Membre Expert
![]() ![]() Inscription : janvier 2004 Messages : 1 238 ![]() |
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/ |
|
|
00
|
|
|
#7 | |||
|
Membre confirmé
![]() |
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:
voila mon expression regulière, mais je ne récupère que des sudo: Code :
__________________
Venez voir par là... |
|||
|
|
00
|
|
|
#8 |
|
Membre Expert
![]() ![]() Inscription : janvier 2004 Messages : 1 238 ![]() |
a premiere vue, je remplacerais deja :
par 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/ |
|
|
00
|
|
|
#9 |
|
Membre expérimenté
![]() Étudiant Inscription : juillet 2004 Messages : 777 ![]() |
C'est quoi le ':' ?
|
|
|
00
|
|
|
#10 | |||
|
Membre confirmé
![]() |
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 :
Citation:
__________________
Venez voir par là... |
|||
|
|
00
|
|
|
#11 | |
|
En attente de confirmation mail
![]() Inscription : juin 2002 Messages : 6 164 ![]() |
Citation:
parenthèse non capturante. Le ':' seul n'a aucune signification.
|
|
|
|
00
|
|
|
#12 | ||
|
Membre Expert
![]() ![]() Inscription : janvier 2004 Messages : 1 238 ![]() |
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 :
__________________
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/ |
||
|
|
00
|
|
|
#13 | ||
|
Membre chevronné
![]() Étudiant Inscription : août 2005 Messages : 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 :
|
||
|
|
00
|
|
|
#14 | ||||
|
Membre Expert
![]() ![]() Inscription : janvier 2004 Messages : 1 238 ![]() |
Ma solution ;o)
y a beaucoup de code, mais c'est essentiellement de l'affichage. La regexp est là : Code :
Code :
#(telnet|ssh|sudo)(?: -l| su -)? (\w+|\d+\.\d+\.\d+\.\d+)[ /](\w+|\d+\.\d+\.\d+\.\d+)? ?\((\w+)?/?(?:(\w+)?|\s*)\).*#
Code :
__________________
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/ |
||||
|
|
00
|
|
|
#15 |
|
Membre chevronné
![]() Étudiant Inscription : août 2005 Messages : 632 ![]() |
mouai "telnet su -" c'est pas tres bon comme syntaxe et pourtant c'est valide dans ta regex :p
|
|
|
00
|
|
|
#16 |
|
Membre Expert
![]() ![]() Inscription : janvier 2004 Messages : 1 238 ![]() |
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/ |
|
|
00
|
|
|
#17 | |||
|
Membre Expert
![]() ![]() Inscription : janvier 2004 Messages : 1 238 ![]() |
bon, voila la derniere version... c'est évolutif, et ca remonte les infos sous forme de tableau :
Code :
Citation:
__________________
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/ |
|||
|
|
00
|
|
|
#18 |
|
Membre confirmé
![]() |
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à... |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com