PHP中的preg_match和UTF-8

PHP中的preg_match和UTF-8

我正在尝试使用preg_match搜索UTF8编码的字符串。

preg_match('/H/u', "\xC2\xA1Hola!", $a_matches, PREG_OFFSET_CAPTURE);echo $a_matches[0][1];

这应该打印1,因为“H”在字符串“¡Hola!”中的索引1处。但它打印2.所以它似乎并没有将主题视为UTF8编码的字符串,即使我在正则表达式中传递“u” 修饰符

我在php.ini中有以下设置,其他UTF8函数正在运行:

mbstring.func_overload = 7mbstring.language = Neutralmbstring.internal_encoding = UTF-8mbstring.http_input = passmbstring.http_output = passmbstring.encoding_translation = Off

有任何想法吗?


素胚勾勒不出你
浏览 646回答 3
3回答

一只萌萌小番薯

尽管u修饰符使得模式和主题都被解释为UTF-8,但捕获的偏移量仍以字节为单位计算。您可以使用mb_strlen以UTF-8字符而不是字节来获取长度:$str = "\xC2\xA1Hola!";preg_match('/H/u', $str, $a_matches, PREG_OFFSET_CAPTURE);echo mb_strlen(substr($str, 0, $a_matches[0][1]));
打开App,查看更多内容
随时随地看视频慕课网APP