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 :

Remplacer une chaîne avec preg_replace [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre confirmé Avatar de GregPeck
    Inscrit en
    Novembre 2005
    Messages
    530
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 530
    Points : 540
    Points
    540
    Par défaut Remplacer une chaîne avec preg_replace
    Bonsoir à tous,

    Je suis en train de faire des remplacements de chaines à coup de substr, strpos, etc...
    Enfin des trucs pas beau du tout et donc par curiosité, j'aimerais savoir comment vous feriez (notamment à coup d'expression régulieres je suppose).

    J'ai une ligne du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    background-image:url(chemin/fichier);
    et je voudrais remplacer le nom du fichier par son md5.

    Ca j'ai réussi à le faire comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $Tmp = preg_replace('!background-image:url(.+);!i', 'background-image:url(cid:'.md5('$1').');', $Tmp);
    Mais là où ca se complique et que je décroche avec les expressions régulieres c'est de récupérer après cette instruction d'une manière ou d'une autre, le chemin en clair et le chemin en MD5.

    Si vous avez des idées, ça pourra pas être plus crade que le code que j'ai pondu...

    Merci !

  2. #2
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    il marche pas ton code. essaie de mettre deux chemins à remplacer dans ta chaine, le md5 ne se fait pas sur chaque, mais seulement à la construction de ton preg, ce qui veut dire que tu fais un md5 de la chaine '$1' et ce md5 sera appliqué à tous les patterns qui matchent...

  3. #3
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Cadeau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <pre><?php
            $Tmp = "toto {
                background-image:url(chemin/fichier);
            }
            ne-doit-pas-etre-change:(chemin/fichier);
            body {
                background-image:url(chemin/fichier2);
            }";
            preg_match_all('!background-image:url(.+);!i', $Tmp, $matches);
            $replaces = array();
            foreach($matches[1] as $key => $match) {
                $matches[1][$key] = '`'.preg_quote('background-image:url'.$match).'`';
                $replaces[] = 'background-image:url('.md5($match).')';
            }
            var_dump($Tmp);
            var_dump($matches[1]);
            var_dump($replaces);
            var_dump(preg_replace($matches[1], $replaces, $Tmp));
            ?></pre>
    Ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    string(192) "toto {
                background-image:url(chemin/fichier);
            }
            ne-doit-pas-etre-change:(chemin/fichier);
            body {
                background-image:url(chemin/fichier2);
            }"
    array(2) {
      [0]=>
      string(41) "`background-image\:url\(chemin/fichier\)`"
      [1]=>
      string(42) "`background-image\:url\(chemin/fichier2\)`"
    }
    array(2) {
      [0]=>
      string(54) "background-image:url(b80273a427eb7f50e789782da4d1cf4e)"
      [1]=>
      string(54) "background-image:url(07c49fb8971f0e1c746086571fe6e0de)"
    }
    string(227) "toto {
                background-image:url(b80273a427eb7f50e789782da4d1cf4e);
            }
            ne-doit-pas-etre-change:(chemin/fichier);
            body {
                background-image:url(07c49fb8971f0e1c746086571fe6e0de);
            }"

  4. #4
    Membre confirmé Avatar de GregPeck
    Inscrit en
    Novembre 2005
    Messages
    530
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 530
    Points : 540
    Points
    540
    Par défaut
    Salut,

    En fait mon code fonctionnait, car je travaillait mon fichier ligne par ligne...
    Je ne connaissais pas preg_match_all, c'est génial comme fonction.

    Merci pour ton intervention et ta réponse, c'est autrement plus propre que mes découpes hazardeuses, j'intègre ça de suite !

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

Discussions similaires

  1. [MySQL] Remplacer une chaîne de caractères dans une base de données
    Par Furius dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 27/11/2013, 21h06
  2. Requète pour remplacer une chaîne (avec variable)
    Par s-c-a-r-a dans le forum Langage SQL
    Réponses: 8
    Dernier message: 10/06/2009, 16h14
  3. Réponses: 4
    Dernier message: 12/05/2006, 19h11
  4. [RegEx] Tester une chaîne avec ereg()
    Par Anduriel dans le forum Langage
    Réponses: 4
    Dernier message: 30/04/2006, 11h36
  5. Remplacer une chaîne de caractères dans une base
    Par Furius dans le forum Requêtes
    Réponses: 4
    Dernier message: 19/10/2005, 23h03

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