Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 11 sur 11
  1. #1
    Membre habitué
    Inscrit en
    mai 2007
    Messages
    402
    Détails du profil
    Informations forums :
    Inscription : mai 2007
    Messages : 402
    Points : 104
    Points
    104

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

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

    Informations forums :
    Inscription : août 2003
    Messages : 3 075
    Points : 6 875
    Points
    6 875

    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
    402
    Détails du profil
    Informations forums :
    Inscription : mai 2007
    Messages : 402
    Points : 104
    Points
    104

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

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

    Informations forums :
    Inscription : août 2003
    Messages : 3 075
    Points : 6 875
    Points
    6 875

    Par défaut

    Désolé , j'ai lu un peu vite.

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

    Code :
    $pattern = '`\<h[1-6]\>(.*?)(fi*)(.*?)\</h[1-6]\>`';
    Pry Framework php5

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

    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 Vincent
    Inscrit en
    juillet 2005
    Messages
    20 894
    Détails du profil
    Informations personnelles :
    Nom : Homme Vincent

    Informations forums :
    Inscription : juillet 2005
    Messages : 20 894
    Points : 27 278
    Points
    27 278

    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 :
    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
    402
    Détails du profil
    Informations forums :
    Inscription : mai 2007
    Messages : 402
    Points : 104
    Points
    104

    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 : 22
    Points
    22

    Par défaut

    Bonjour,
    Voilà une solution en utilisant une fonction récursive :

    Code :
    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
    402
    Détails du profil
    Informations forums :
    Inscription : mai 2007
    Messages : 402
    Points : 104
    Points
    104

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

    Informations forums :
    Inscription : mars 2009
    Messages : 221
    Points : 268
    Points
    268

    Par défaut

    Tu peux utiliser ça:
    Code :
    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
    402
    Détails du profil
    Informations forums :
    Inscription : mai 2007
    Messages : 402
    Points : 104
    Points
    104

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •