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 :

Rechercher et remplacer dans un fichier


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 40
    Points : 40
    Points
    40
    Par défaut Rechercher et remplacer dans un fichier
    Bonjour,

    Ma question n'est pas à proprement parler liée au PHP, mais je pense pouvoir l'appliquer via mon éditeur de texte (Notepad++ ou Textwrangler).
    Voilà, je veux rechercher un chaîne de caractère commençant par "attachment_id=" suivi d'un nombre commençant par "10" et suivi de 2 chiffres pour un total donc de 4 chiffres (soit 1000 à 1099). Je dois pouvoir isoler le "attachment_id=10" des 2 chiffres restants pour y insérer un 0.
    Soit par exemple :
    attachment_id=1095 doit devenir attachment_id=10095

    Et j'ai la même problématique inverse avec un début commençant par "attachment_id=" suivi de "10" puis de 4 chiffres.
    Je dois pouvoir supprimer le 1er "0" dans 10xxxx qui doit devenir 1xxxx.

    Je ne pense pas que cela soit bien compliqué mais je suis complètement perdu dans les expressions régulières.
    Si quelqu'un peut me donner un coup de main ce serait sympa.

    Merci !

  2. #2
    Membre habitué Avatar de denissay
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 103
    Points : 125
    Points
    125
    Par défaut
    Pour rajouter un 0, utilises "\b(attachment_id=10)(\d{2})\b" et puis remplaces par "\10\2"

    Pour enlever un 0, utilises "\b(attachment_id=1)0(\d{4})\b" et puis remplaces par "\1\2"
    Une réponse utile vous a aidé ? N'oubliez pas le
    Votre problème est résolu ? N'oubliez pas le

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 40
    Points : 40
    Points
    40
    Par défaut
    Merci pour la réponse, par contre je ne sais pas si m'y prends comme il faut mais j'ai tenté ce petit test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <?php
    $chaine = 'attachment_id=1012 attachment_id=101234';
     
    var_dump( preg_replace("\b(attachment_id=10)(\d{2})\b", "\10\2", $chaine) );
    echo $chaine;
    ?>
    qui me renvoie "NULL attachment_id=1012 attachment_id=101234".
    Je ne sais pas si je me suis trompé dans la syntaxe mais en tout cas je n'ai pas le bon résultat.

    Merci

  4. #4
    Membre habitué Avatar de denissay
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 103
    Points : 125
    Points
    125
    Par défaut
    Bon, tu avais dit que tu voulais l'appliquer dans un éditeur de texte !! Si tu veux le coder en php il faudra faire quelques modifications:
    1. Tu dois utiliser un délimiteur pour tes patterns comme ~ par exemple (pour en lire plus: http://www.expreg.com/expreg_article...rt=apcre_delim)
    2. Tu modifies ton expression de remplacement, car le programme croit qu'il doit remplacer par le groupe '10' qui n'existe pas
    3. Tu peux appliquer plusieurs pattern avec différents remplacements sur le même string d'un seul coup (voir la doc pour en savoir plus: http://php.net/manual/en/language.types.array.php)
    4. Et finalement tu dois savoir que preg_replace ne modifie pas le string d'origine, donc, son retour doit être restocké si tu en as besoin plus tard


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $input = 'attachment_id=1012 attachment_id=101234';
     
    $pattern = Array('~\b(attachment_id=10)(\d{2})\b~', '~\b(attachment_id=1)0(\d{4})\b~');
     
    $replacement = Array('${1}0$2', '$1$2');
     
    $output = preg_replace($pattern, $replacement, $input);
     
    echo $input;
    echo '<br>';
    echo $output;
    DEMO
    Une réponse utile vous a aidé ? N'oubliez pas le
    Votre problème est résolu ? N'oubliez pas le

  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
    Sinon, tu peux faire les deux opérations d'un coup, ça évite de parcourir la chaîne deux fois:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $pattern = '~\battachement_id=1\K(?|(0)(\d{2})|()0(\d{4}))\b~';
    $repl = '\1\1\2';
    $result = preg_replace($pattern, $repl, $chaine);
    Quelques éléments:

    \K permet d'enlever tout ce qui est à sa gauche du résultat de la correspondance. Dans le cas présent attachement_id=1 est donc enlevé du résultat et ne sera pas remplacé (pas besoin de le réécrire dans la chaîne de remplacement, d'utiliser une capture, ou un lookbehind).

    (?|...(...)...(...)...|...(...)...(...)...) est un branch reset qui permet de conserver les mêmes numéros de groupe de capture entre les deux (ou plusieurs) alternatives. Donc dans le cas avec quatre chiffres, le premier groupe est vide, dans le cas à deux chiffres le premier groupe contient zéro.

    Cela dit on peut très bien se passer du branch reset et utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $pattern = '~\battachement_id=1\K(?:(0)(\d{2})|0(\d{4}))\b~';
    $repl = '\1\1\2\3';
    Le seul inconvénient c'est que l'on doit créer un groupe de capture supplémentaire.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

Discussions similaires

  1. recherche et remplace dans un fichier
    Par magalou68 dans le forum VBScript
    Réponses: 5
    Dernier message: 21/06/2010, 19h20
  2. Réponses: 3
    Dernier message: 11/06/2009, 17h49
  3. Shell - Rechercher et remplacer dans un fichier
    Par rom0607 dans le forum Linux
    Réponses: 3
    Dernier message: 12/06/2008, 20h59
  4. Rechercher/Remplacer dans un fichier excel
    Par godmich dans le forum VB.NET
    Réponses: 2
    Dernier message: 03/01/2008, 09h12
  5. Afficher, rechercher et remplacer dans un fichier
    Par lynal dans le forum Langage
    Réponses: 1
    Dernier message: 13/06/2006, 21h24

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