p
u
b
l
i
c
i
t
é
publicité

Discussion: Utilisation preg_replace [PHP 5.3]

  1. #1
    Membre habitué
    Inscrit en
    mai 2007
    Messages
    406
    Détails du profil
    Informations forums :
    Inscription : mai 2007
    Messages : 406
    Points : 113
    Points
    113

    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 "fi" et pour "fl" c'est "fl".
    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

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Dév. Web / Android
    Inscrit en
    août 2003
    Messages
    3 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Dév. Web / Android
    Secteur : Industrie

    Informations forums :
    Inscription : août 2003
    Messages : 3 454
    Points : 8 280
    Points
    8 280

    Par défaut

    Utilise plutôt str_replace pour ce genre de chose simple
    Pry Framework php5

  3. #3
    Membre habitué
    Inscrit en
    mai 2007
    Messages
    406
    Détails du profil
    Informations forums :
    Inscription : mai 2007
    Messages : 406
    Points : 113
    Points
    113

    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
    Dév. Web / Android
    Inscrit en
    août 2003
    Messages
    3 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Dév. Web / Android
    Secteur : Industrie

    Informations forums :
    Inscription : août 2003
    Messages : 3 454
    Points : 8 280
    Points
    8 280

    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

  5. #5
    Membre habitué
    Inscrit en
    mai 2007
    Messages
    406
    Détails du profil
    Informations forums :
    Inscription : mai 2007
    Messages : 406
    Points : 113
    Points
    113

    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
    23 928
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : juillet 2005
    Messages : 23 928
    Points : 35 192
    Points
    35 192

    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);

  7. #7
    Membre habitué
    Inscrit en
    mai 2007
    Messages
    406
    Détails du profil
    Informations forums :
    Inscription : mai 2007
    Messages : 406
    Points : 113
    Points
    113

    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
    Membre habitué
    Inscrit en
    mai 2007
    Messages
    406
    Détails du profil
    Informations forums :
    Inscription : mai 2007
    Messages : 406
    Points : 113
    Points
    113

    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
    Membre émérite Avatar de CosmoKnacki
    Homme Profil pro
    Inscrit en
    mars 2009
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : mars 2009
    Messages : 548
    Points : 918
    Points
    918

    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.

  11. #11
    Membre habitué
    Inscrit en
    mai 2007
    Messages
    406
    Détails du profil
    Informations forums :
    Inscription : mai 2007
    Messages : 406
    Points : 113
    Points
    113

    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. Réponses: 6
    Dernier message: 07/05/2012, 22h43
  2. utilisation preg_replace
    Par larsulrich dans le forum Regex
    Réponses: 2
    Dernier message: 19/03/2010, 13h54
  3. Utiliser $_SERVER avec un preg_replace
    Par GarGamel55 dans le forum Syntaxe
    Réponses: 1
    Dernier message: 09/10/2006, 17h11
  4. utilisation de preg_replace
    Par magdalena dans le forum Regex
    Réponses: 1
    Dernier message: 30/08/2006, 14h43
  5. utilisation de preg_replace sur des balises
    Par Kerod dans le forum Regex
    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