在php中将字节位置转换为字符位置

在php中将字节位置转换为字符位置,php,utf-8,byte,Php,Utf 8,Byte,我有utf-8字符串中字符的字节位置(通过preg_匹配和preg_OFFSET_捕获获得)。但我需要角色的位置。我怎样才能得到它 以下是一个例子: 我有这样的想法: $x = 'öüä nice world'; preg_match('/nice/u', $x, $m, PREG_OFFSET_CAPTURE); var_dump($m); 其结果是: array(1) { [0]=> array(2) { [0]=> string(4) "ni

我有utf-8字符串中字符的字节位置(通过preg_匹配和preg_OFFSET_捕获获得)。但我需要角色的位置。我怎样才能得到它

以下是一个例子: 我有这样的想法:

$x = 'öüä nice world';
preg_match('/nice/u', $x, $m, PREG_OFFSET_CAPTURE);
var_dump($m);
其结果是:

array(1) {
  [0]=>
  array(2) {
    [0]=>
    string(4) "nice"
    [1]=>
    int(7)
  }
}
所以我有字节的位置,是7

但是我需要角色的位置是4。有没有办法将字节位置转换为字符位置


这个例子非常简单。我不能用
mb\u strpos
或类似的东西来找到“nice”一词的位置。我需要正则表达式,实际上我需要
preg\u match\u all
而不是
preg\u match
。因此,我认为转换职位对我来说是最好的方式。

如前所述,您可以根据以下示例之一:


这显示了“nice”紧跟其后的每个字符位置

看一看这个问题:-有很多答案专门针对你的问题。
$x = 'öüä nice öüä nice öüä nice öüä nice öüä nice';
$r = preg_match_all('/nice/u', $x, $m, PREG_OFFSET_CAPTURE);
for($i = 0; $i < $r; $i++) {
    var_dump(mb_strlen(substr($x, 0, $m[0][$i][1])));
}
int(4)
int(13)
int(22)
int(31)
int(40)