使用 preg_match() 获取匹配前的多字节字符计数
问题:
执行时使用 preg_match() 与 UTF-8 编码字符串进行正则表达式匹配PREG_OFFSET_CAPTURE 参数,生成的偏移量以字节为单位计算,而不是字符数。在匹配多字节字符时,这可能会出现问题,因为它们的字节长度可能与其字符长度不同。
例如,使用以下代码来匹配 UTF-8 编码字符串中的“H”字符,结果偏移量为 2,即使字符“H”位于索引处1:
$str = "\xC2\xA1Hola!"; preg_match('/H/u', $str, $a_matches, PREG_OFFSET_CAPTURE); echo $a_matches[0][1];
解决方案:
要获取正确的字符计数偏移量,请使用 mb_strlen() 确定匹配的子字符串的长度:
$str = "\xC2\xA1Hola!"; preg_match('/H/u', $str, $a_matches, PREG_OFFSET_CAPTURE); echo mb_strlen(substr($str, 0, $a_matches[0][1]));
这将计算 UTF-8 字符的偏移量,提供正确的结果。
以上是如何在使用 PREG_OFFSET_CAPTURE 的 preg_match() 之后获取 UTF-8 字符串中的正确字符偏移量?的详细内容。更多信息请关注PHP中文网其他相关文章!