Preg_Replace et UTF8
Je suis à l'amélioration de nos vidéo page de recherche pour mettre en surbrillance la recherche terme(s) dans les résultats. Parce que l'utilisateur peut entrer judas priest
et une vidéo a Judas Priest
dans son texte, je dois utiliser des expressions régulières pour préserver la casse du texte original.
Mon code fonctionne, mais j'ai des problèmes avec les caractères spéciaux comme š, č and ž
, il semble que Preg_Replace()
ne correspondent si le cas est le même (malgré le /ui
modificateur).
Mon code:
$Content = Preg_Replace ( '/\b(' . $term . '?)\b/iu', '<span class="HighlightTerm">$1</span>', $Content );
J'ai aussi essayé ceci:
$Content = Mb_Eregi_Replace ( '\b(' . $term . '?)\b', '<span class="HighlightTerm">\</span>', $Content );
Mais il ne fonctionne pas. Elle correspond à "SREČA" si le terme de recherche est "SREČA", mais si le terme de recherche est "sreča" ce ne sera pas le match (et vice versa).
Alors, comment dois-je faire ce travail?
mise à jour: je vous définissez les paramètres régionaux et codage interne:
Mb_Internal_Encoding ( 'UTF-8' );
$loc = "UTF-8";
putenv("LANG=$loc");
$loc = setlocale(LC_ALL, $loc);
/
ou *
dans la requête de recherche?Terme de recherche est désinfecté avant de me faire quelque chose avec elle. Merci pour le commentaire.
Au lieu de "désinfection", vous pouvez utiliser
preg_quote
J'utilise celle-ci 🙂
OriginalL'auteur Jan Hančič | 2010-01-14
Vous devez vous connecter pour publier un commentaire.
Je me sens vraiment stupide droite environ maintenant, mais le problème n'était pas avec Preg_* fonctions à tous. Je ne sais pas pourquoi, mais j'ai d'abord vérifié si le terme est encore dans la chaîne avec
StriPos
et depuis que la fonction n'est pas multi-octets en toute sécurité, il est retournéfalse
si le cas de le texte n'était pas le même que le terme de recherche, de sorte que lePreg_Replace
n'était même pas appelé.Donc la leçon à tirer ici est que toujours utiliser multi-octets versions de fonctions si vous avez des chaînes de caractères UTF8.
OriginalL'auteur Jan Hančič
Pas sûr de ce que votre problème est dû, mais je viens de mettre ensemble ce peu de cas de test:
Elle est sortie sur ma machine:
Semble fonctionner correctement?
mb_regex_encoding
ne résout pas le problème (j'ai déjà les deux autres) :\mb_strtolower convertit les caractères correctement
OriginalL'auteur gnarf
Si je ne me trompe pas,
preg_match
utilise les paramètres régionaux en cours. Essayez définition des paramètres régionaux à la langue qui ces personnages appartient. Vous avez probablement besoin d'une utf8 en fonction des paramètres régionaux. Si vous avez des langues mixtes dans votre page, vous trouverez peut-être un générique internationale locale qui fonctionne.Voir aussi: http://www.phpwact.org/php/i18n/utf-8
UTF-8
est probablement pas valide locale sur n'importe quel système. Essayez d'exécuterlocale -a
sur un shell, pour obtenir les paramètres régionaux pris en charge. Vous voulez probablement celui qui ressemble àen_GB.utf8
.Merci. J'ai changé pour
sl_SI.UTF-8
, mais le résultat est le même ...+1 pour le lien pour que phpwact page!
OriginalL'auteur troelskn