2 votes

Mise en évidence d'un terme de recherche accentué à l'aide de preg_replace

J'ai essayé de mettre en gras un terme de recherche dans une phrase. Si la phrase est Engliš is spoken wörldwide. Si mon terme de recherche est spoken world Je veux obtenir Engliš is <b>spoken wörld</b>wide.

J'ai utilisé cette fonction :

function highlightWords($text, $searchTerm){
   $corr = ['a' => '[aäâ]', 'o' => '[oöòóôõ]', 'c' => '[cç]', 's' => '[ssšss]', 'y' => '[ýÿyyy]', 'o' => '[ôöòóøooõ]', 'n' => '[ñnnn]',  'u' => '[üu]'];
   $key = preg_quote($searchTerm);
   $pattern = '/' . strtr($key, $corr) . '/iu';
   $text = preg_replace($pattern, '<b>$0</b>', $text);
   return $text;
}

C'est censé fonctionner, mais j'obtiens un comportement vraiment étrange. Voici quelques exemples :

Le texte est Sygmaý çykdy desdi-sähra düzünden (désolé pour cette phrase bizarre). Quand $searchTerm es duz cela fonctionne parfaitement, j'obtiens Sygmaý çykdy desdi-sähra <b>düz</b>ünden . Si je change le terme de recherche en sahra la fonction renvoie un simple Sygmaý çykdy desdi-sähra düzünden .

Fonctionne avec cykdy y çykdy .

Mais ne fonctionne pas avec les deux sygmay ni sygmaý . Mais cela fonctionne avec Sygmaý avec une majuscule.

Que dois-je corriger pour que le terme de recherche soit mis en évidence dans tous les scénarios ?

3voto

Cedric de lEpine Points 1

Il y a quelques problèmes dans la fonction, en particulier dans la section $corr le tableau.

Premièrement, il y a deux sections "o", et elles sont différentes. Il faut les combiner. Deuxièmement, la lettre non accentuée doit être dans le tableau pour chaque lettre. s n'a pas cela, le "s" manquant est la cause de cet échec particulier.

Fonction fixe :

function highlightWords($text, $searchTerm)
{
    $corr    = [
        'a' => '[aäâ]', 
        'o' => '[oöòóôõøo]', 
        'c' => '[cç]', 
        's' => '[sssšss]', 
        'y' => '[yýÿyy]', 
        'n' => '[nñnn]', 
        'u' => '[uü]'
    ];
    $key     = preg_quote($searchTerm);
    $pattern = '/' . strtr($key, $corr) . '/iu';
    $text    = preg_replace($pattern, '<b>$0</b>', $text);
    return $text;
}

$input = 'Sygmaý çykdy desdi-sähra düzünden';
$term  = 'sahra';

$expected = 'Sygmaý çykdy desdi-<b>sähra</b> düzünden';

$highlighted = highlightWords($input, $term);

assert($highlighted == $expected, 'Term should be marked bold');
echo $highlighted . PHP_EOL;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X