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 :

Utilisation preg_replace [RegEx]


Sujet :

Langage PHP

  1. #1
    Invité
    Invité(e)
    Par défaut Utilisation preg_replace
    Bonjour,
    Sur un site j'utilise une police qui a comme inconvénient d'afficher un carré quand les lettres "fi" ou "fl" sont dans un mot.
    Pour afficher ces lettres il faut les remplacer par un code.
    Pour "fi" c'est "" et pour "fl" c'est "".
    Comme la police n'est utilisée que pour des titres avec les balises h1 a h6, je me suis dit que preg_replace() pourrait m'aider, seul problème, avec ce que j'ai fait seul le premier fi est remplacé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $string = '<h2>Quel type de fichier de configuration nous envoyer ?</h2>';
    $pattern = '/<h[1-6]>(.*?)(fi*)(.*?)<\/h[1-6]>/';
    $replacement = '$1 xx$3';
    echo preg_replace($pattern, $replacement, $string);
    Merci de votre aide
    Dernière modification par Invité ; 03/12/2012 à 10h53.

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Utilise plutôt str_replace pour ce genre de chose simple
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bah non car comme je le disais c'est uniquement pour les balises h1 a h6.
    donc le reste du texte n'a pas a être soumis a ce changement.

  4. #4
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Désolé , j'ai lu un peu vite.

    En échappant correctement les < et > du pattern ça donne quoi ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pattern = '`\<h[1-6]\>(.*?)(fi*)(.*?)\</h[1-6]\>`';
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Invité
    Invité(e)
    Par défaut
    Seulement le premier fi est remplacé par xx.
    J'avoue ne pas savoir comment faire. Pourtant je suis certain que preg_replace est la solution.

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Chez moi ça fonctionne.
    Sauf dans le cas ou ton titre est sur plusieurs lignes, auquel cas il faut le modifieur "s"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    $string = 'blablablabla<h2>Quel type de fichier de configuration nous envoyer ?</h2>blablablabla
    <h2>Quel type de fichier de configuration nous envoyer ?</h2>blablablabla<h2>Quel type de fichier de configuration
     nous envoyer ?</h2>blablablabla';
    $pattern = '/<h[1-6]>(.*?)(fi*)(.*?)<\/h[1-6]>/s';
    $replacement = '$1 xx$3';
    echo preg_replace($pattern, $replacement, $string);
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Invité
    Invité(e)
    Par défaut
    oui en effet mais si tu regarde bien le fi de configuration n'est pas changé.
    C'est ce je voulais dire.
    Seulement le premier fi est remplacé par xx.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2009
    Messages : 19
    Points : 24
    Points
    24
    Par défaut
    Bonjour,
    Voilà une solution en utilisant une fonction récursive :

    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
     
    function recursive_replace($string)
    {
    	$pattern = '/(<h[1-6]>.*?)(fi*)(.*?<\/h[1-6]>)/s';
    	if (preg_match($pattern,$string,$m))
    	{
    		$string = str_replace($m[0],$m[1] . "xx".$m[3],$string);
     
    		return recursive_replace($string);
    	}
    	else
    	{
    		return $string;
    	}
    }
     
    $res = strip_tags(recursive_replace($string));
     
    echo $res;
    $res =>
    blablablablaQuel type de xxchier de conxxguration nous envoyer ?blablablabla
    Quel type de xxchier de conxxguration nous envoyer ?blablablablaQuel type de xxchier de conxxguration
    nous envoyer ?blablablabla

  9. #9
    Invité
    Invité(e)
    Par défaut
    Solution très intéressante je te remercie, mais normalement le preg_replace devrait le faire tout comme un str_replace le ferrait sur tout le string.

    Si je comprend bien le remplacement se fait uniquement quand fi est au début d'un mot et pas a l’intérieur du mot.
    Donc pour moi il c'est l'expression régulière qui n'est pas complète.
    Mais pour le coup ça dépasse mes compétences.

  10. #10
    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
    Tu peux utiliser ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_replace('#(fi)(?=[^<]*?</h[1-6]>)#s', 'xx', $string);
    Attention! Cette regex ne fonctionne pas si la balise hx contient d'autres balises.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  11. #11
    Invité
    Invité(e)
    Par défaut
    C'est parfait.
    Merci beaucoup a tout le monde de votre aide.
    Et a CosmoKnacki pour la réponse.

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

Discussions similaires

  1. [RegEx] Comment utiliser preg_replace() quand il y a un . ou un ?
    Par pierrot10 dans le forum Langage
    Réponses: 6
    Dernier message: 07/05/2012, 22h43
  2. [RegEx] utilisation preg_replace
    Par larsulrich dans le forum Langage
    Réponses: 2
    Dernier message: 19/03/2010, 13h54
  3. Utiliser $_SERVER avec un preg_replace
    Par GarGamel55 dans le forum Langage
    Réponses: 1
    Dernier message: 09/10/2006, 17h11
  4. [RegEx] utilisation de preg_replace
    Par magdalena dans le forum Langage
    Réponses: 1
    Dernier message: 30/08/2006, 14h43
  5. [RegEx] utilisation de preg_replace sur des balises
    Par Kerod dans le forum Langage
    Réponses: 5
    Dernier message: 09/12/2005, 13h46

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