mb_ereg_search_init作为单字节工作?

时间:2011-02-05 14:18:45

标签: php utf-8 mbstring

检查此代码段:

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应该支持多字节? 如果我,是否有任何内置函数可以满足我的需求?

提前致谢。

1 个答案:

答案 0 :(得分: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个字节,您可以正确计算它们。但是,如果你想在regexp中使用多字节字符('λ+'),它将不起作用。