preg_match在包含非UTF8字符的二进制字符串的开头找不到UTF-8字符

问题描述 投票:0回答:2

如果字符串中的某个位置是非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字符?

php regex utf-8 preg-match
2个回答
0
投票

您也可以考虑使用T-Regx,它以更合作的方式处理UTF8错误:

try {
    pattern('^.', 'u')->match("ABCD\xc3")->all();
catch (SafeRegexException $e) {
    // handle
}

0
投票

基于此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"
}
© www.soinside.com 2019 - 2024. All rights reserved.