【发布时间】:2019-11-05 08:42:21
【问题描述】:
如果字符串中某处是非 UTF8 字符,带有修饰符 u 的 preg_match 将返回 false 以表示错误。 例如:
<?php
$string = "ABCD\xc3";
$r = preg_match('/^./u',$string, $match);
var_dump($r); //bool(false)
这个例子你自己试试:https://3v4l.org/qkHl4
如果非UTF8字符在末尾被删除,则正则表达式查找第一个字符。
$string = "ABCD";
$r = preg_match('/^./u',$string, $match);
var_dump($r, $match);
//int(1) array(1) { [0]=> string(1) "A" }
对于还包含非 UTF8 字符的字符串,是否有一种简单的方法可以使用正则表达式来识别开头的 UTF-8 字符?
【问题讨论】:
-
对于第一个示例,我还期望找到字符“A”。我怀疑 preg_match 在使用正则表达式之前首先检查整个字符串是否所有字符都是 UTF-8。
-
根据这个answer你可以使用mb_convert_encoding删除无效的utf字符
-
如果您的字符串不是有效的 UTF-8,为什么要使用
u模式并期望它能够工作......? -
这个“\u{c3}”是一个UTF-8字符“Ô,这个“\xc3”不是一个UTF-8字符。我的字符串也包含非 UTF8 字符。
-
如果您的字符串包含“非 UTF-8 字符”,则它不是有效的 UTF-8/Unicode 字符串,
u预计并且仅适用于 UTF-8 字符串。你要么有一个有效的 UTF-8 字符串,然后可以在上面使用 Unicode 正则表达式,要么你没有,你不能。
标签: php regex utf-8 preg-match