如果字符串中的某个位置是非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字符?
您也可以考虑使用T-Regx,它以更合作的方式处理UTF8错误:
try {
pattern('^.', 'u')->match("ABCD\xc3")->all();
catch (SafeRegexException $e) {
// handle
}
基于此answer,您可以使用mb_convert_encoding删除无效的utf字符:
$string = "ABCD\xc3";
$string = mb_convert_encoding($string, 'UTF-8', 'UTF-8');
$r = preg_match('/^./u', $string, $match);
var_dump($r, $match);
给出以下结果:
int(1)
array(1) {
[0] =>
string(1) "A"
}