我有 UTF-8 字符串,我想搜索所有出现的img_(\d+)
. 我试过原版的
$pattern = '/img_(\d+)/u';
preg_match_all($pattern, $text, $matches, PREG_OFFSET_CAPTURE);
但它给了我错误的模式偏移。
我也尝试过:
mb_internal_encoding('UTF-8');
$pattern = 'img_(\d+)';
mb_ereg_search_init($content, $pattern);
$matches = [];
while ($result = mb_ereg_search_regs()) {
$matches[] = [
'match' => $result[0],
'offset' => mb_ereg_search_getpos() - mb_strlen($result[0]),
];
}
但它给了我与 相同的结果preg_match_all
。
但是,当我使用以下命令手动运行搜索时:
$pos = mb_strpos($content, "img_1", 0);
我得到了正确的偏移量。
示例代码:
$str = "příliš žluťoučký img_1 kůn úpěl ďábelské ódy";
$pattern = '/img_(\d+)/u';
preg_match_all($pattern, $str, $matches, PREG_OFFSET_CAPTURE);
print_r($matches); //gives 24 (wrong)
echo mb_strpos($str, "img_1", 0); //gives 17 (correct)
如何解决这个问题?
preg_match_all()
根据文档,该功能似乎按预期工作:由于它返回以字节为单位的偏移量,因此重音字符计数为 2,并且 24 是正确的值。
如果您仍然需要获取“多字节偏移量”,您仍然可以使用字节偏移量提取字符串的第一部分,然后计算字符数: