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 :

Remplacement \n par \r\n [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2010
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2010
    Messages : 153
    Points : 107
    Points
    107
    Par défaut Remplacement \n par \r\n
    Bonjour à tous,
    J'ai une petite fonction anti-bareLF pour l'envoi d'emails en PHP. Elle est simplissime... peut-être trop !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function AntiBareLF($txt) {
    	return preg_replace("|[^\r](\n)|", "\r\n", trim($txt));
    }
    Le but est de remplacer les \n seuls par des \r\n, je veux donc remplacer touts les occurrences de \n non précédées de \r.

    Au lancement j'ai ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $chaine = "On va s'aimer\r\nOn va s'aimer\nOn va s'aimer\n";
    echo AntiBareLF($chaine);
     
    #Résultat :
    On va s'aimer
    On va s'aime
    On va s'aimer
    Il y a 2 problèmes :
    - celui du milieu a le r qui a sauté
    - celui en bout de chaine n'est pas modifié.

    Pour mieux visualiser, j'ai une petite fonction qui remplace les \r par R et \n par \N et le résultat est
    On va s'aimerRNOn va s'aimeRNOn va s'aimer
    On voit bien que le r de la deuxième ligne a sauté et que la dernière ligne n'a plus le \n du tout, sans être remplacé.

    Si vous pouvez m'éclairer sur ce résultat bizarre, merci d'avance

  2. #2
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    On va s'aimerRNOn va s'aimeRNOn va s'aimer
    [1] Si vous faites une opération trim(), il n'y a plus rien après la dernière particule "s'aimer", vous êtes bien d'accord?, donc, le doute là s'en va, d'accord?

    [2] Le pattern [^\r]\n veut dire un caractère qui n'est pas \r suivi d'un \n, tous les deux caractères vont être remplacés dans preg_replace() par \r\n.

    [2.1] Il ne va pas matcher \r\n après la première s'aimer, d'accord?, donc, rien n'y est fait.
    [2.2] Pourtant, pour la deuxième s'aimer, "s'aimer\n", les deux caractères r\n sont bien un bon candidat pour matcher, le résultat est donc s'aimeRN.

    Voilà les explications.

    Pour faire ce que vous voulez faire, mieux est à s'en profiter simplement le "lookbehind" négatif, comme ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function AntiBareLF($txt) {
        return preg_replace("|(?<!\r)\n|", "\r\n", trim($txt));
    }

  3. #3
    Membre régulier
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2010
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2010
    Messages : 153
    Points : 107
    Points
    107
    Par défaut
    ah là je comprends mon erreur.

    En effet j'avais oublié le trim .

    La question de la disparition du r vient du fait que j'ai cru que ça remplaçait uniquement la parenthèse capturante (\n) par "\r\n".
    Mais en fait ça remplace TOUTE la chaine correspondant au pattern, c'est à dire "n'importe quoi non \r + \n"

    Bien compris, merci

  4. #4
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 897
    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 897
    Points : 6 661
    Points
    6 661
    Par défaut
    Le plus simple dans ce cas, c'est de ne pas faire de quartiers et de tout remplacer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return preg_replace('~\R~', "\r\n", trim($txt));

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 23/01/2006, 12h02
  2. Remplacer null par...
    Par HichamK dans le forum Oracle
    Réponses: 4
    Dernier message: 17/01/2006, 13h56
  3. Réponses: 2
    Dernier message: 14/11/2005, 13h33
  4. [Configuration] remplacement des é par des i
    Par illegalsene dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 18/10/2005, 16h37
  5. [ASP] include remplacer chemin par variable
    Par damn dans le forum ASP
    Réponses: 3
    Dernier message: 01/10/2004, 15h27

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