使用带有 u 修饰符的 preg_match 进行 UTF8 处理时,可能会遇到意外行为,其中 PREG_OFFSET_CAPTURE 返回字节计数而不是字符计数.
preg_match('/H/u', "\xC2\xA1Hola!", $a_matches, PREG_OFFSET_CAPTURE); echo $a_matches[0][1]; // Prints 2, but should be 1 for "H" in "¡Hola!"
尽管如此u 修饰符将模式和主题标记为 UTF8 编码,偏移量仍以字节为单位。要获取基于字符的偏移量,您可以使用 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])); // Prints 1
以上是为什么 PREG_OFFSET_CAPTURE 使用 UTF8 和'u”修饰符返回字节计数而不是字符计数?的详细内容。更多信息请关注PHP中文网其他相关文章!