检查此代码段:
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 :(得分: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中使用多字节字符('λ+'
),它将不起作用。