1. #1
    Membre habitué
    Inscrit en
    mai 2007
    Messages
    406
    Détails du profil
    Informations forums :
    Inscription : mai 2007
    Messages : 406
    Points : 113
    Points
    113

    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.

  2. #2
    Modérateur
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    mars 2004
    Messages
    3 708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : mars 2004
    Messages : 3 708
    Points : 8 672
    Points
    8 672

    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
    # Dans la Création, tout est permis mais tout n'est pas utile...

  3. #3
    Membre émérite Avatar de CosmoKnacki
    Homme Profil pro
    Inscrit en
    mars 2009
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : mars 2009
    Messages : 539
    Points : 899
    Points
    899

    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?

  4. #4
    Modérateur
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    mars 2004
    Messages
    3 708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : mars 2004
    Messages : 3 708
    Points : 8 672
    Points
    8 672

    Par défaut

    Il faudrait voir avec preg_quote()
    # Dans la Création, tout est permis mais tout n'est pas utile...

  5. #5
    Membre émérite Avatar de CosmoKnacki
    Homme Profil pro
    Inscrit en
    mars 2009
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : mars 2009
    Messages : 539
    Points : 899
    Points
    899

    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.

  6. #6
    Membre habitué
    Inscrit en
    mai 2007
    Messages
    406
    Détails du profil
    Informations forums :
    Inscription : mai 2007
    Messages : 406
    Points : 113
    Points
    113

    Par défaut

    preg_quote() est la bonne solution.
    Merci de vos réponses.

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

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