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 Perl Discussion :

Débutant : preg_replace


Sujet :

Langage Perl

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2010
    Messages : 3
    Par défaut Débutant : preg_replace
    Bonjour,

    Je veux créer une fonction ajouteNbsp() qui remplace les espaces simples en espaces insécables devant ":" ";" "»" "?" et après "«". Bref, une fonction pour la typographie française. Pour l'instant, j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function ajouteNbsp($text){ 
     $text = preg_replace('/ ([:|;|!|»|\\?])/', ' $1', $text); 
     $text = preg_replace('/([«]) /', '$1 ', $text); 
     return $text;
    }
    mais, pour une raison que j'ignore, " « " devient " « ". Moi je veux " « ". J'ai pensé que c'était un problème d'encodage, et j'ai essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     $text = preg_replace('/ ([:|;|!|\xc2\xbb|\\?])/', ' $1', $text); 
     $text = preg_replace('/([\xc2\xab]) /', '$1 ', $text);
    mais ça donne le même résultat.

  2. #2
    Membre chevronné
    Avatar de Schmorgluck
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2006
    Messages : 371
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function ajouteNbsp($text){ 
     $text = preg_replace('/ ([:|;|!|»|\\?])/', ' $1', $text); 
     $text = preg_replace('/([«]) /', '$1 ', $text); 
     return $text;
    }
    Je ne sais pas si ç'a un rapport avec ton problème, mais je ne comprends pas bien à quoi te servent les crochets, ici, ou tes barres verticales. Soit tu utilises une classe de caractères, soit tu utilises l'alternative, mais ne mets pas de barres verticales dans une classe, sauf si tu veux que ta classe reconnaisse ce caractère. D'autre part, es-tu sûr que ton point d'interrogation est correctement échappé ? Il me semble qu'il y a un antislash de trop.

    Ça c'est pour la première regex. Pour la deuxième, la question qui se pose est : pourquoi utiliser une classe de caractères pour un seul caractère ?

    Voici une version nettoyée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function ajouteNbsp($text){ 
     $text = preg_replace('/ ([:;!»\?])/', ' $1', $text); 
     $text = preg_replace('/(«) /', '$1 ', $text); 
     return $text;
    }
    À mon avis, si elle ne marche pas, c'est un problème de syntaxte PHP, pas de Perl.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2010
    Messages : 3
    Par défaut
    Citation Envoyé par Schmorgluck Voir le message
    À mon avis, si elle ne marche pas, c'est un problème de syntaxte PHP, pas de Perl.
    Merci pour la version nettoyée, mais le problème persiste ; j'obtiens toujours " « ". Ma fonction se trouve effectivement dans un fichier PHP. J'ai peut-être eu tort de poser cette question dans un forum Perl. Désolé, je suis débutant. Quelqu'un sait-il, cependant, comment corriger la fonction ?

  4. #4
    Membre chevronné
    Avatar de Schmorgluck
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2006
    Messages : 371
    Par défaut
    J'ai trouvé, c'est effectivement un problème d'encodage.

    Essaie ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function ajouteNbsp($text){ 
     $text = preg_replace('/ ([:;!?]|»)/', ' $1', $text); 
     $text = preg_replace('/(«) /', '$1 ', $text); 
     return $text;
    }
    Le problème, comme tu l'avais subodoré, c'est que les caractères '«' et '»' sont codés sur deux octets, considérés par défaut comme deux caractères séparés. Or, quand on utilise une classe de caractère, c'est pour reconnaître un seul caractère. Du coup, écrire équivaut à écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    / (:|;|!|\?|\xc2|\xbb)/
    Par conséquent, chaque fois que le caractère \xc2 est trouvé à la suite d'une espace, celle-ci est transformée, que le \xc2 soit celui au début de '«' ou celui au début de '»'. La solution est donc, soit de sortir '»' de la classe de caractères (celle que j'ai mise ci-dessus), soit d'utiliser un mode locale pour que le moteur de regex de Perl reconnaisse '«' et '»' chacun comme un caractère, mais je ne sais pas comment faire ça à partir de PHP, ni même si c'est possible.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2010
    Messages : 3
    Par défaut
    Citation Envoyé par Schmorgluck Voir le message
    La solution est donc, soit de sortir '»' de la classe de caractères (celle que j'ai mise ci-dessus)
    Ça fonctionne impeccablement ! Merci mille fois ; je n'y serai pas arrivé tout seul. Je t'adore !

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

Discussions similaires

  1. Débutant XML
    Par viny dans le forum XML/XSL et SOAP
    Réponses: 8
    Dernier message: 25/07/2002, 12h07
  2. [Kylix] Re Re: débutant sur Kylix et Linux.....
    Par Eclypse dans le forum EDI
    Réponses: 2
    Dernier message: 08/06/2002, 22h53
  3. [Kylix] Le débutant en Kylix et Linux....
    Par Eclypse dans le forum EDI
    Réponses: 2
    Dernier message: 08/05/2002, 10h37
  4. Réponses: 3
    Dernier message: 07/05/2002, 16h06
  5. [HyperFile] 2 questions de débutant
    Par khan dans le forum HyperFileSQL
    Réponses: 2
    Dernier message: 29/04/2002, 23h18

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