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 :

preg_replace : remplacement de caractères


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2013
    Messages : 3
    Par défaut preg_replace : remplacement de caractères
    Bonjour, j'ai un petit problème avec la fonction preg_replace() pour remplacer les caractères (‘’) par le caractère ('), seulement s'il y a des caractères alphabétiques avant et après un des caractères que je veux remplacer, et donc voilà mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $text = "‘Rien ne doit être remplacé ici’. Ici, l’element qui doit être remplacé.";
    $text = preg_replace("#([a-zA-Z]+)[‘’]([a-zA-Z]+)#","$1'$2",$text);
    Mais le problème dans ce code c'est que la chaine $text ne change pas en:
    "‘Rien ne doit être remplacé ici’. Ici, l'element qui doit être remplacé."

    J'ai essayé d'autres codes mais ça a toujours pas marché, Mais quand j'essaie ce même code dans un autre fichier à part, ça marche. (P.S: le code que je viens de poster est dans une classe et $text est envoyé par POST)
    Je sais pas si c'est juste une histoire de charset, ou bien c'est mon code qui ne marche pas, Qu'en pensez-vous ?

  2. #2
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    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 986
    Par défaut
    Bonjour,

    pour que ça fonctionne tu dois préciser au moteur de regex que tu veux travailler en unicode. Pour cela il suffit de rajouter le modifier u à la fin de ta pattern:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #([a-zA-Z]+)[‘’]([a-zA-Z]+)#u
    Au passage, je pense que tu peux avantageusement faire ceci pour ton preg_replace:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $text = preg_replace('#\p{L}\K[‘’](?=\p{L})#u', "'", $text);
    Ce qui te permettra de gérer les accents.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2013
    Messages : 3
    Par défaut Autre problème :/
    Re,
    J'ai pas bien compris le deuxième code, pourriez-vous me l'expliquer ?

    Sinon, j'ai un autre problème, voilà :
    Je voudrais cette fois remplacer toute la ponctuation contenue dans des phrase entre ‘’ “” «» et () par de petites abréviations du genre {:point:} {:virgule:}...
    voilà le code que j'ai fais mais qui marche pas s'il y a plus d'un element :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $regex = "#([‘“«\(])([^»«”“‘’\(\)]+)\.([^«»”“‘’\(\)]+)?([»”’\)])#u";
    $text = preg_replace($regex,"$1$2{:point:}$3$4",$text);
    Qu'en pensez vous ?

  4. #4
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    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 986
    Par défaut
    Le 2e code se contente de trouver les ‘ ou ’ qui sont encadrés avec une lettre de chaque coté, sans consommer les dites lettres.

    \p{L} est une classe de caractères qui match toutes les lettres (même les alphabets autres que latin)
    \K réinitialise les correspondances (le moteur de regex fait comme si il ne s'était rien passé). Les caractères matchés précédement n'ont donc pas été consommés, mais on a néanmoins confirmé leur présence, ce qui évite de devoir les réinjecter dans la chaîne de remplacement.
    (?=\p{L}) est un test avant (lookahead) qui vérifie la présence d'une lettre juste aprés [‘’]. L'avantage du test avant est qu'il ne consomme pas, lui non plus, de caractères.

    Donc au final les seuls caractères qui ont été consommés sont ceux qui nous intéressent et qu'il suffit de remplacer par '.

    Maintenant pour ton autre problème, tu peux utiliser des arrays avec preg_replace et traiter chaque signe un par un. (voir l'exemple 2 de la documentation)

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2013
    Messages : 3
    Par défaut Problème avec les balises
    RE,

    Merci CosmoKnacki, mais j'ai de nouveau un autre problème :/ . Cette fois c'est pour supprimant toutes les balises html (en gardant que leurs contenu) sauf les balises div et p, j'ai essayé ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $html = preg_replace('/<((?!p|div)[a-zA-Z0-9]*?)\s*?[^>]*?>(.?)<\/\1>/s','$2',$html);
    Mais soit ça ne marche pas. Je sais pas ce qui cloche dans mon code:/

Discussions similaires

  1. Remplacement du caractère ?
    Par Mvu dans le forum ASP
    Réponses: 9
    Dernier message: 06/01/2005, 18h11
  2. Réponses: 11
    Dernier message: 01/12/2004, 19h09
  3. [CR] Chercher et remplacer un caractère dans 1 chaine
    Par franck.cvitrans dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 29/09/2004, 16h42
  4. Fonction permettant de remplacer des caractères
    Par PrinceMaster77 dans le forum ASP
    Réponses: 3
    Dernier message: 06/09/2004, 15h48
  5. Remplacer un caractère
    Par Mvu dans le forum ASP
    Réponses: 5
    Dernier message: 20/07/2004, 09h57

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