1

检查这个片段:

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

提前致谢。

4

1 回答 1

0

从手册页mb_ereg_search_pos

一个数组,包括多字节正则表达式的匹配部分的位置。数组的第一个元素将是匹配部分的开头,第二个元素将是匹配部分的长度(字节)。出错时返回 FALSE。

我的解释是它总是返回字节数,而不是实际位置。如果您检查更多这些多字节函数,至少还有一个暗示它应该以这种方式工作。不要问我这个函数的目的是什么......

如果您想知道 first 的位置C,可以使用mb_strpos

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

如果你想不惜一切代价简单地破解它,有一个解决方案。您必须先解码字符串:

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

字符串变为????????CCC,每个问号正好是 1 个字节,您可以正确计算它们。但是,如果你现在想在正则表达式中使用多字节字符 ( 'λ+'),它就行不通了。

于 2011-10-18T17:32:25.207 回答