Précédent   Forum du club des développeurs et IT Pro > 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
 
Outils de la discussion
Publicité
'
Vieux 23/11/2012, 20h57   #1
christobale
Membre régulier
 
Inscription : mai 2007
Messages : 322
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 322
Points : 76
Points : 76
Par défaut Exprésion réguliere problème avec $

Bonjour,
J'ai un système qui recherche les valeurs de plusieurs DEFINE dans un fichier et les remplaces par une nouvelle valeur.
Dernièrement j'ai rajouté une nouvelle donnée dans ce fichier. Une clé pour crypter mes mots de passe.
Le problème est que lorsque je passe en paramètre la valeur de la clé (ex : $2a$07$R68DidcybS5gslnTxgZ3QFBDn$) l'expression régulière semble avoir des problème avec les $ car la valeur renvoyé est ('a$R68DidcybS5gslnTxgZ3QFBDn$) simple cote du début compris.
Pour exemple:
État de départ
Code :
DEFINE('CLE_CRYPTAGE', '') ;
État attendu
Code :
DEFINE('CLE_CRYPTAGE', '$2a$07$R68DidcybS5gslnTxgZ3QFBDn$') ;
État obtenu (et il y a bien 2 simple cote au début)
Code :
DEFINE('CLE_CRYPTAGE', ''a$R68DidcybS5gslnTxgZ3QFBDn$') ;
Voici le script que j'utilise, si qq peux m'aider.
Code :
1
2
3
4
5
6
7
8
9
10
11
$defines = array("'CLE_CRYPTAGE'"); // les constantes à changer
$remplacer = array("'".$cle."'");  // les nouvelles valeurs
 
$valeur = '(([\'"]).*?\2|[^\s)]+)'; // match anciennes valeurs
$regex = array();
 
foreach ($defines as $define) 
{
	$regex[] = '`DEFINE\s*\(\s*' . $define . '\s*,\s*\K' . $valeur . '`si';
}
$NewConfig = preg_replace($regex, $remplacer, $filename);
Merci de votre aide.
christobale est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2012, 22h43   #2
rawsrc
Modérateur
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 2 589
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 36
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 2 589
Points : 6 054
Points : 6 054
Envoyer un message via Skype™ à rawsrc
Salut,

je ne comprends pas tout : tu essaies de redéfinir la valeur d'une constante ?
Si oui, c'est cuit, PHP ne l'autorise pas : regarde ici
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2012, 05h29   #3
CosmoKnacki
Membre habitué
 
Avatar de CosmoKnacki
 
Homme
Inscription : mars 2009
Messages : 106
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : mars 2009
Messages : 106
Points : 129
Points : 129
Bonjour,

le problème est que les $ suivies de chiffres de $remplacer sont interprétés comme des références aux (éventuelles) parenthèses capturantes de $regex et sont donc remplacer par rien.
Je n'ai pas trouvé comment les échapper pour qu'ils ne soient pas interprétés, mais il doit sûrement y avoir un moyen.
Il faut donc pour éviter cela échapper les $ avec un antislash. Et puis c'est tout!
Code :
1
2
3
4
5
6
7
8
9
10
$remplacer = str_replace('$','\$',array("'".$cle."'"));  // les nouvelles valeurs
 
$valeur = '(([\'"]).*?\2|[^\s)]+)'; // match anciennes valeurs
$regex = array();
 
foreach ($defines as $define) 
{
	$regex[] = '`DEFINE\s*\(\s*' . $define . '\s*,\s*\K' . $valeur . '`si';
}
$NewConfig = preg_replace($regex, $remplacer, $filename);
J'ai choisi ici | comme caractère de remplacement, mais à toi de trouver le plus approprié, voire une chaîne de caractère encore inédite dans l'univers.

En fait, le but de ce script est de modifier un fichier définissant des constantes pour un usage ultérieur, si j'ai bien compris?
CosmoKnacki est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2012, 09h00   #4
rawsrc
Modérateur
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 2 589
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 36
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 2 589
Points : 6 054
Points : 6 054
Envoyer un message via Skype™ à rawsrc
Il faudrait voir avec preg_quote()
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2012, 12h37   #5
CosmoKnacki
Membre habitué
 
Avatar de CosmoKnacki
 
Homme
Inscription : mars 2009
Messages : 106
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : mars 2009
Messages : 106
Points : 129
Points : 129
Zut! En fait, on peut très bien échapper le $ juste avec un antislash! Tout à l'heure, ça ne marchait pas (je ne sais pas ce que j'ai fichu!). Je corrige donc mon précédent post.
CosmoKnacki est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2012, 10h25   #6
christobale
Membre régulier
 
Inscription : mai 2007
Messages : 322
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 322
Points : 76
Points : 76
preg_quote() est la bonne solution.
Merci de vos réponses.
christobale est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 11h37.


 
 
 
 
Partenaires

Hébergement Web