Equivalent preg_match_all[PHP] en SHELL

Fermé
devweb - Modifié par devweb le 10/07/2012 à 10:56
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 - 10 juil. 2012 à 15:15
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 33336 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 5 novembre 2024 7 801
10 juil. 2012 à 11:01
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 vendredi 2 avril 2010 Statut Membre Dernière intervention 23 août 2020 10
10 juil. 2012 à 11:08
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 dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 417
10 juil. 2012 à 11:55
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 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
Modifié par [Dal] le 10/07/2012 à 15:36
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