2011-02-05 15 views
1

檢查這個片段:mb_ereg_search_init作爲單字節工作?

mb_internal_encoding("UTF-8"); 
mb_regex_encoding("UTF-8"); 
mb_ereg_search_init('καλημέραCCC', 'C+'); 
$pos = mb_ereg_search_pos(); 
echo $pos[0]; 

(請不要在這個具體的例子發表評論,這不是我的使用情況下,這是我遇到的問題的減少)

即使字符串「 καλημέρα「由8個字符組成,上面的片段打印16個。 我錯過了什麼嗎?是不是mb_ereg_search_init應該支持多字節? 如果我在,是否有任何內置函數可以滿足我的需求?

在此先感謝。

+0

帶有`u`修飾符的普通`preg_match`不能正常工作嗎? – NikiC 2011-02-05 14:33:12

+0

preg_match返回匹配數(0或1,因爲它在第一次匹配時停止),而不是匹配在字符串中的位置:/ – 2011-02-05 14:37:35

回答

0

從手冊頁mb_ereg_search_pos

一種陣列,包括匹配部的一個多字節 正則表達式的位置。數組的第一個元素將是 匹配部分的開始,第二個元素將是匹配部分的長度(字節) 。它在錯誤時返回FALSE。

我的解釋是,它總是返回字節數,而不是實際位置。如果你檢查更多這些多字節函數,至少有one more暗示它應該以這種方式工作。不要問我這是什麼功能則的目的...

如果你想知道的第一C公正的立場,你可以使用mb_strpos

mb_strpos('καλημέραCCC', 'C'); // 8 

如果你想簡單破解它在所有的費用,都有一個解決方案。你必須串首先解碼:

mb_ereg_search_init(utf8_decode('καλημέραCCC'), 'C+'); 

字符串變成????????CCC,每一個問號正好是1個字節,你都能夠正常計數。但是,如果您現在想在正則表達式中使用多字節字符('λ+'),它將不起作用。