Equivalent preg_match_all[PHP] en SHELL

devweb -  
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   -
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 33766 Date d'inscription   Statut Modérateur Dernière intervention   7 878
 
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 26 Date d'inscription   Statut Membre Dernière intervention   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 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 430
 
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 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
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