Fixation de votre approche actuelle
Notez que vous pouvez changer votre première regex à ~[\p{L}\p{M}]+~u
pour correspondre à toutes les lettres Unicode (\p{L}
avec modificateur u
prend connaissance Unicode et correspond à toutes les lettres Unicode) et diacritiques (\p{M}
matchs combinant marques) et ajouter un modificateur u
à la seconde preg_replace
:
function highlight_term($text, $words)
{
$i = preg_match_all('~[\p{L}\p{M}]+~u', $words, $m);
if($i == 0 )
{
return $text;
}
$re = '~' . implode('|', $m[0]) . '~iu';
return preg_replace($re, '<b>$0</b>', $text);
}
$str = "ह ट इ ड यन भ भ और द";
echo highlight_term($str, 'और');
Résultat: ह ट इ ड यन भ भ <b>और</b> द
.
Voir la PHP demo
Vous devez modificateur u
dans la seconde regex que le texte que vous passez au modèle est Unicode et vous travaillez toujours avec la chaîne Unicode. Pas besoin de parenthèses externes dans la deuxième regex car vous êtes uniquement intéressé par toute la valeur de correspondance (vous remplacez en utilisant $0
backreference).
meilleure façon
Vous pouvez passer un tableau de mots à la fonction de mise en évidence, et correspondre des mots seulement entiers avec les limites des mots qui passent directement l'expression rationnelle à la fonction preg_replace
:
function highlight_term($text, $words)
{
return preg_replace('~\b(?:' . implode("|", $words) . ')\b~u', '<b>$0</b>', $text);
}
$str = "ह ट इ ड यन भ भ और द";
echo highlight_term($str, ['और','भ']);
// => ह ट इ ड यन <b>भ</b> <b>भ</b> <b>और</b> द
Voir this PHP demo
Vous feriez mieux de tracer votre code. Je doute que vous l'ayez lu du tout. – revo
Vous avez besoin de 'u' dans la deuxième regex:' $ re = '~'. implode ('|', $ m [0]). 'ui'; '. Pas besoin de parenthèses externes car vous êtes uniquement intéressé par la valeur de correspondance entière (vous remplacez en utilisant la référence arrière $ 0). –