2010-01-14 60 views
3

我正在加強我們的video search page以突出顯示搜索結果中的搜索項。因爲用戶可以在文本中輸入judas priest,並且視頻中有Judas Priest,我必須使用正則表達式來保留原始文本的大小寫。Preg_Replace和UTF8

我的代碼工作,但我有特殊字符,如š, č and ž的問題,看來,如果情況是相同的(儘管/ui修改)Preg_Replace()將只匹配。 我的代碼:

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

我也試過這樣:

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

但它也不起作用。如果搜索字詞是「SREČA」,它將匹配「SREČA」,但是如果搜索字詞是「sreča」,它將不匹配它(反之亦然)。

那麼我該如何做這項工作?

更新:我設置的語言環境和內部編碼:

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

您是否考慮過如果用戶在搜索查詢中輸入特殊字符(如'/'或'*')會發生什麼? – 2010-01-14 09:30:28

+0

搜索詞在我做任何事之前都已經過消毒。感謝評論。 – 2010-01-14 09:31:42

+0

而不是「消毒」,你可以使用'preg_quote' – troelskn 2010-01-14 10:03:56

回答

6

我覺得現在真的很愚蠢,但問題不在於Preg_ *函數。我不知道爲什麼,但我首先檢查給定的字詞是否與StriPos字符串一致,並且由於該函數不是多字節安全的,所以如果文本的情況與搜索字詞不同,則返回false,所以甚至沒有叫Preg_Replace

所以這裏學到的教訓是,如果你有UTF8字符串,總是使用多字節版本的函數。

+1

阿門,兄弟。阿門。 – 2016-06-21 15:01:44

2

如果我沒有記錯,preg_match使用當前的語言環境。試試setting the locale這些字符所屬的語言。你可能也需要一個基於utf8的語言環境。如果您的頁面中有混合語言,則可以找到可用的通用國際語言環境。

參見:http://www.phpwact.org/php/i18n/utf-8

+0

請參閱我的問題的更新。 – 2010-01-14 10:11:59

+1

在任何系統上,UTF-8可能都不是有效的語言環境。嘗試在shell上運行locale -a來獲取支持的語言環境。你可能想要一個看起來像'en_GB.utf8'的。 – troelskn 2010-01-14 10:16:32

+0

謝謝。我已將其更改爲'sl_SI.UTF-8',但結果相同... – 2010-01-14 10:20:18

2

不知道你的問題是從所產生的,但我只是把一起這個小測試案例:

<?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"); 

這是我的機器上輸出:

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

似乎正常工作?

+0

添加'mb_regex_encoding'沒有解決問題(我已經有另外兩個):\ – 2010-01-14 10:26:42

+0

mb_strtolower正確地轉換字符 – 2010-01-14 10:32:18