IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Exprésion réguliere problème avec $ [RegEx]


Sujet :

Langage PHP

  1. #1
    Invité
    Invité(e)
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    DEFINE('CLE_CRYPTAGE', '') ;
    État attendu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DEFINE('CLE_CRYPTAGE', '$2a$07$R68DidcybS5gslnTxgZ3QFBDn$') ;
    État obtenu (et il y a bien 2 simple cote au début)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DEFINE('CLE_CRYPTAGE', ''a$R68DidcybS5gslnTxgZ3QFBDn$') ;
    Voici le script que j'utilise, si qq peux m'aider.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.
    Dernière modification par ok.Idriss ; 24/11/2012 à 15h49.

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    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

  3. #3
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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?
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  4. #4
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Il faudrait voir avec preg_quote()

  5. #5
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    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.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  6. #6
    Invité
    Invité(e)
    Par défaut
    preg_quote() est la bonne solution.
    Merci de vos réponses.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [RegEx] Problème avec une expression réguliere
    Par figatelliSTI dans le forum Langage
    Réponses: 4
    Dernier message: 20/02/2008, 09h59
  2. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo