PHP et expressions régulières : mettre des mots en surbillance

Tags: #<Tag:0x00007faa1fe53fa0>

Bonjour,
J’écris un script PHP qui met des mots en surbrillance dans des chaînes de caractère.
Je cherche à mettre le mot entier en surbrillance, pas une partie de mot, en utilisant \b.
Ça fonctionne bien quand il n’y a pas de caractères accentués.
Par exemple :

$str1="Je ne bois pas de café car la caféine m'empêche de dormir. Je préfère une autre boisson.";
$str2=preg_replace('/\bbois\b/','<span style="background-color:yellow;">$0</span>',$str1);
echo '<p>'.$str2.'</p>';

Le mot bois est bien mis en surbrillance quand il est seul, mais pas à l’intérieur de boisson.

Tout se gâte avec un caractère accentué en fin de mot :

$str3=preg_replace('/\bcafé\b/','<span style="background-color:yellow;">$0</span>',$str1);
echo '<p>'.$str3.'</p>';

Là, café est mis en surbrillance dans caféine, mais pas quand il est tout seul.
(J’imagine que le problème se pose aussi quand le caractère accentué est en début de mot.)

Comment résoudre ce problème ?

Bonjour,

Pour moi, tu utilises la mauvaise fonction, moi j’utiliserais str_replace() :

$subject = "Je ne bois pas de café car la caféine m'empêche de dormir. Je préfère une autre boisson.";
$search = "café";
echo str_replace ($search , "<span class='surligner'>{$search}</span>", $subject);

Le problème avec str_replace, c’est que le début de caféine sera aussi mis en surbrillance, ce que je souhaite éviter.
C’est pour ça que j’ai utilisé preg_replace, pour pouvoir mettre l’option \b (= limite de mot), mais cette option ne fonctionne pas avec les caractères accentués.

Bonjour,

Il faut indiquer que les chaînes doivent être traitées en UTF-8 avec /u :

$str3=preg_replace('/\bcafé\b/u','<span style="background-color:yellow;">$0</span>',$str1);

https://www.php.net/manual/fr/reference.pcre.pattern.modifiers.php

Super, ça marche nickel ! Merci !
Ça va beaucoup m’aider, mieux que les horribles bricolages que j’utilisais jusqu’à présent.