使用 preg_match() 与 PREG_OFFSET_CAPTURE 参数匹配 UTF-8 字符串时,用户可能会遇到意外的情况偏移量以字节而不是字符计算的行为。尽管使用了 u 修饰符,它为模式和主题启用了 UTF-8 支持,但捕获的偏移量仍然基于字节。
要解决此差异并获取基于字符的偏移量,可以采用涉及 mb_strlen 的解决方法。此函数提供指定子字符串的 UTF-8 字符计数。通过在捕获的匹配项之前的主题字符串的子字符串上使用 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])); // Outputs 1
通过合并 mb_strlen,我们确保偏移量表示 UTF-8 字符串中的字符位置,提供精确且预期的结果。
以上是为什么 preg_match() 偏移量以字节为单位,而不是字符,即使支持 UTF-8?的详细内容。更多信息请关注PHP中文网其他相关文章!