Preg_replace ve UTF8

3 Cevap php

Ben bizim video search page sonuçlarında arama terimi (ler) vurgulamak için artırılması ediyorum. Kullanıcı judas priest girebilir ve bir video bu metin var Judas Priest sahip olduğu Çünkü özgün metnin harf korumak için düzenli ifadeler kullanmak zorunda.

My code works, but I have problems with special characters like š, č and ž, it seems that Preg_Replace() will only match if the case is the same (despite the /ui modifier). My code:

$Content = Preg_Replace ( '/\b(' . $term . '?)\b/iu', '<span class="HighlightTerm">$1</span>', $Content );

Ben de bu çalıştı:

$Content = Mb_Eregi_Replace ( '\b(' . $term . '?)\b', '<span class="HighlightTerm">\\1</span>', $Content );

Ama bu da işe yaramazsa. Arama terimi "Sreca'yı" ise bu "Sreca'yı" maç olacak, ancak arama terimi "Sreca'yı" ise onu maç (ve tersi) olmaz.

Peki nasıl bu işi yapabilirim?

update: Ben yerel ve iç kodlama ayarlayabilirsiniz:

Mb_Internal_Encoding ( 'UTF-8' );
$loc = "UTF-8";
putenv("LANG=$loc");
$loc = setlocale(LC_ALL, $loc);

3 Cevap

Ben şimdi gerçekten aptal hakkı hissediyorum ama sorun hiç Preg_ * fonksiyonları ile değildi. Nedenini bilmiyorum ama verilen terim StriPos ve bu işlevi multi-byte güvenli değildir çünkü false döndürdü ile dize bile eğer ben ilk kontrol eğer durum metin arama terimi olarak aynı değildi, bu yüzden Preg_Replace bile çağrılmadı.

Yani burada öğrenilmesi gereken ders, UTF8 dizeleri varsa her zaman fonksiyonları multi-byte sürümlerini kullanmanızı olmasıdır.

Yanılmıyorsam eğer, preg_match geçerli yerel ayarı kullanır. Bu karakterler aittir dile setting the locale sahipsiniz. Muhtemelen de bir utf8 merkezli yerel gerekir. Sayfanızda karma dil varsa, çalışan bir genel uluslararası yerel bulmak mümkün olabilir.

Ayrıca bakınız: http://www.phpwact.org/php/i18n/utf-8

Bu senin sorunun değil kaynaklanan, ama ben sadece birlikte bu küçük test case ne koymak emin olun:

<?php

$uc = "SREČA";

mb_internal_encoding('utf-8');
echo $uc."\n";
$lc = mb_strtolower($uc);
echo $lc."\n";

echo preg_replace("/\b(".preg_quote($uc).")\b/ui", "<span class='test'>$1</span>", "test:".$lc." end test");

Benim makinede çıkışı bulunuyor:

SREČA
sreča
test:<span class='test'>sreča</span> end test

Düzgün çalışıyor gibi görünüyor?