Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6
  1. #1
    Membre habitué
    Inscrit en
    mai 2007
    Messages
    402
    Détails du profil
    Informations forums :
    Inscription : mai 2007
    Messages : 402
    Points : 104
    Points
    104

    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.

  2. #2
    Modérateur
    Avatar de rawsrc
    Homme Profil pro Martin
    Dev indep
    Inscrit en
    mars 2004
    Messages
    3 538
    Détails du profil
    Informations personnelles :
    Nom : Homme Martin
    Â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 538
    Points : 8 006
    Points
    8 006

    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 confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Inscrit en
    mars 2009
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : mars 2009
    Messages : 221
    Points : 268
    Points
    268

    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 :
    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 Martin
    Dev indep
    Inscrit en
    mars 2004
    Messages
    3 538
    Détails du profil
    Informations personnelles :
    Nom : Homme Martin
    Â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 538
    Points : 8 006
    Points
    8 006

    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 confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Inscrit en
    mars 2009
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : mars 2009
    Messages : 221
    Points : 268
    Points
    268

    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
    402
    Détails du profil
    Informations forums :
    Inscription : mai 2007
    Messages : 402
    Points : 104
    Points
    104

    Par défaut

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

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •