Equivalent preg_match_all[PHP] en SHELL

devweb -  
[Dal] Messages postés 6373 Statut Contributeur -
Bonjour,

Je recherche une commande qui pourrait être équivalent à la fonction preg_match_all de PHP.
Mon but est de convertir tout mon site en connexion PDO (actuellement avec mysql) et donc convertir mes requêtes mysql en des requêtes préparées :
Dans le code php ci-dessous, je voudrais que toutes les variables soient remplacées par des "?" (pour ça pas de problème, je le fais avec sed) mais surtout les récupérer pour les passer dans le execute :

Code initial :
$req = mysql_query('SELECT * FROM 'ma_table' WHERE pseudo="'.$pseudo.'" AND statut="'.$statut.'"  ');


Code voulu :
$req = $db->query('SELECT * FROM 'ma_table' WHERE pseudo="?" AND statut="?"  '); 
$req->execute(array($pseudo,$statut)); 


Avez-vous une piste pour réaliser ceci avec une commande shell ? L'équivalent en PHP serait preg_match_all pour récupérer toutes les variables dans un tableau.

Merci de votre aide
A voir également:

4 réponses

mamiemando Messages postés 34184 Statut Modérateur 7 888
 
La question c'est les récupérer mais où et pour en faire quoi ?

Avec sed, si tu utilises l'opérateur \( \) tu peux récupérer des morceaux qui matchent avec ton expression régulière et les réutiliser dans la chaîne de remplacement avec \1 et \2. Je ne pense pas que tu puisses aller beaucoup plus loin juste avec sed.

Si ça ne suffit pas à répondre à ton besoin, il faut utiliser un outil plus évolué. Le plus simple est peut-être d'utiliser un langage de script comme par exemple python :
https://stackoverflow.com/questions/3865896/translating-php-s-preg-match-all-to-python

Bonne chance
0
devweb Messages postés 30 Statut Membre 10
 
Je peux effectivement récupérer les variables avec les parenthèses capturantes, mais le problème est que je ne sais pas à l'avance combien d'éléments doivent matcher dans chacune de mes requêtes.

Je ne sais malheureusement pas programmer avec Python mais je vais tout de même jeter un oeil.

Merci
0
zipe31 Messages postés 38797 Statut Contributeur 6 433
 
Salut,

Sans garantie vue que je n'ai qu'un maigre exemple pour tester ;-((

$ cat plop 
$req = mysql_query('SELECT * FROM 'ma_table' WHERE pseudo="'.$pseudo.'" AND statut="'.$statut.'"  ');

$ cat script.sed 
s/\([^ ]*\)[^_]*_\(.*\)/\1 = $db->\2/
h
s/[^.]*\.\([^.]*\)\.[^.]*/\1,/g
s/\(.*\),/->execute(array(\1));/g
x
s/"[^"]*"/"?"/g
G
s/\([^ ]*\)\([^\n]*\)\n\(.*\)/\1\2\n\1\3/

$ sed -f script.sed plop 
$req = $db->query('SELECT * FROM 'ma_table' WHERE pseudo="?" AND statut="?"  ');
$req->execute(array($pseudo,$statut));

$

;-))
0
[Dal] Messages postés 6373 Statut Contributeur 1 106
 
Salut,

Avec Perl :

cat plop | perl -e 'while(<STDIN>){ my @matched = /\.(\$.+?)\./g; my $joined = join(",",@matched); if (/^.*\$req\s*=\s*mysql_query/){ $_ =~ s/'\.\$.+?\.'/?/g; $_ =~ s/(^.*\$req\s*=\s*mysql_query\s*)(\(.*\))\s*;/\$req = \$db->query$2; \$req->execute(array($joined));/;} print $_; }' 

Cela ne va modifier que les lignes dans lesquelles il y a "$req = mysql_query" avec ou sans espaces.


Dal
0