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 :

Expression régulière remplacement de chaines [PHP 7]


Sujet :

Langage PHP

  1. #1
    Membre habitué Avatar de obtuli31
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2011
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 43
    Points : 132
    Points
    132
    Par défaut Expression régulière remplacement de chaines
    Bonjour,

    J'aimerais surlignes des mots clés dans une chaine (ou le mot clé dans une partie du mot).
    J'ai du mal avec les expressions régulières, j'ai un bout de code mais il ne répond pas à mon besoin.
    Dans le code ci-dessous, seul le mot : lait (le premier) est surligné, mais il faudrait surligner toutes les occurrences et uniquement lait.
    Par exemple dans "laitier" seules les 3 lettres seraient surlignées, dans "vallaite" idem seules la partie "lait" serait surlignée.

    Je galère un peu, si vous avez une idée.

    Merci

    OB.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $text = 'Le lait, le laitier est passé, vallaite callait';
    $text = preg_replace("/\b(lait)\b/i", '<span style="background:#5fc9f6">\1</span>', $text);
    Dans cette phrase j'ai besoin de surligner partout où il y a les 4 lettes (lait) , mais pas le mot en entier

  2. #2
    Membre expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 797
    Points : 3 076
    Points
    3 076
    Par défaut
    Bonjour

    Pour jouer avec des regex, voici un magnifique site : https://regex101.com/r/rsU8aZ/1/

    Tu vois que c'est assez simple en fait, il suffit d'écrire "lait" si j'ai bien compris ta demande.

    L'astuce est donc la seconde partie "/gm" qui permet une recherche globale afin qu'il ne s'arrête pas au premier élément.

    Bonne journée.

  3. #3
    Membre habitué Avatar de obtuli31
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2011
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 43
    Points : 132
    Points
    132
    Par défaut Remplacement de chaine
    Merci Cavo789

    Je ne suis pas un as sur les expressions régulières, je vais bucher dessus

    J'ai un peu adapté le code : (/mg renvoi une erreur)

    J'avais indiqué le mot lait pour l'exemple, mais le pattern est plus complexe (prise en compte des accents dans les mots clés)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $text = preg_replace("/(".$pattern.")/mi", $replacement, $text);
    Encore merci pour ton aide et pour l'url regex101

  4. #4
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 912
    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 912
    Points : 6 705
    Points
    6 705
    Par défaut
    Le modificateur (ou flag) g n'est pas utilisé en PHP car c'est la fonction preg_* utilisée qui détermine si la recherche est globale ou non. Seule preg_match s'arrête à la première occurrence trouvée, les autres fonctions preg_* sont globales mais peuvent être limitées avec leur paramètre '$limit' (4e paramètre de preg_replace par exemple).

    Il suffit effectivement de taper "lait" sans les word boundaries \b autour pour ce que tu souhaites obtenir. Un word boundary \b est la limite entre un caractère de la classe \w (une lettre, un chiffre ou un souligné) et un autre caractère. C'est pour ça que \blait ne matchera pas appelait ou que lait\b ne matchera pas laitage.

    Par contre le modificateur m n'est pas utile car il concerne uniquement l'interprétation des ancres ^ et $. Si tu veux que la pattern soit insensible à la casse, garde le modificateur i. Et comme tu parles d'accents et que bien sûr tu manipules des chaînes encodées en utf-8, mieux vaut l'indiquer au moteur de regex par le modificateur u pour éviter toute ambiguïté (dans les classes de caractères) et pour qu'il se déplace bien caractère par caractère et non octet par octet.

    Si ta pattern ne contient rien d'autre que la cible que tu veux encadrer (rien avant rien après), tu peux te passer de groupe de capture, car la correspondance global est en soi un groupe de capture, le groupe 0, auquel tu peux faire référence dans la chaîne de remplacement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo preg_replace('~été~ui', '<$0>', 'Été ___ répété ___ été');
    // <Été> ___ rép<été> ___ <été>

  5. #5
    Membre habitué Avatar de obtuli31
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2011
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 43
    Points : 132
    Points
    132
    Par défaut regex
    CosmoKnacki Merci pour tes réponses et les explications.

    Je développe rarement en php, sur le coup j'ai pas mal de lacunes.

    J'ai n'ai pas réussi à afficher les bons caractères et colorer les mots clés en même temps, ca ne marche que si je transforme le texte avec htmlentities, mais les balises qui colorent les mot clés sont traitées comme du texte classique et donc visibles.

    J'ai donc ensuite tout remplacé : c'est très moche comme codage, je sais, mais ça marche pour pallier à une urgence.

    Je vais essayer avec l'option "u" dans le preg_replace

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                    $my1="&lt;b&gt;&lt;font color='red'&gt;";
    		$my2="<b><font color='red'>";
    		$my3="&lt;/font&gt;&lt;/b&gt;";
    		$my4="</font></b>";
    		$ltitre=str_replace($my1,$my2,$ltitre);
    		$ltitre=str_replace($my3,$my4,$ltitre);
    merci

    OB

  6. #6
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 912
    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 912
    Points : 6 705
    Points
    6 705
    Par défaut
    En l'occurrence c'est pas trop le PHP qui pèche ici, mais plutôt tes connaissances en matière d'encodage, et, malheureusement pour toi, s'il y a bien un domaine où on ne peut pas s'en sortir en tâtonnant, c'est celui-là! Car c'est la galère assurée!

    Si c'est pour une "urgence" je peux te garantir que tu empreintes le chemin le plus long! Reviens sur l'autre thread que tu as lancé, fait un test en enlevant absolument tout tes remplacements ainsi que toutes les conversions (utf8_encode, htmlentities, ...), bref tout ce que tu as cru bon d'ajouter pour solutionner ton problème d'encodage. Indique le bon encodage dans les balises meta (comme je te l'ai suggéré dans l'autre thread) et dis moi (dans l'autre thread) ce que tu obtiens (clique droit, afficher le code source de la page).

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

Discussions similaires

  1. Expressions régulières - Longueur de chaines.
    Par caddy dans le forum Général Java
    Réponses: 3
    Dernier message: 28/12/2009, 16h31
  2. Réponses: 0
    Dernier message: 24/11/2009, 10h20
  3. [Expression régulière] Début de chaine
    Par navis84 dans le forum Oracle
    Réponses: 8
    Dernier message: 10/10/2006, 14h52
  4. Réponses: 4
    Dernier message: 25/07/2006, 18h37
  5. [String][replaceAll][Expression régulière]Remplacement multi
    Par cpr0 dans le forum Collection et Stream
    Réponses: 9
    Dernier message: 09/04/2004, 17h40

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