如何使用PHP检测4字节字符

时间:2019-11-02 11:05:12

标签: php unicode

我需要帮助来使用PHP检测字符串何时包含4字节字符。是否有可以有效地执行此操作的内置函数或正则表达式?

我已经找到了有关更换的文章,但是找不到一个可以检测到的有效示例。

Can php detect 4-byte encoded utf8 chars?

这是我所了解的,但也失败了:

$chars = str_split($term);
foreach ($chars as $char) {
    if (strlen($char) >= 4) {
        print "Found 4-byte character\n";
    }
}

2 个答案:

答案 0 :(得分:3)

您可以使用正则表达式来匹配BMP之外的所有字符,这些字符是U+FFFF上方Unicode空间中的所有字符

$str = '€?A?¢';

$r = preg_match_all('|[\x{10000}-\x{10FFFF}]|u', $str, $matches);

var_dump($matches[0]);

在这里尝试:https://3v4l.org/JX9aQ

有趣的事实。如果您使用的是PHP 7.4,则可以使用mb_str_split()array_filter()来实现。我认为它不会比正则表达式更有效,但是很高兴知道。

$nonBMP = array_filter(mb_str_split($str), fn($c) => strlen($c)==4);

答案 1 :(得分:2)

如果使用utf8字符,则必须使用多字节字符串函数。这些功能使您可以显示字符串中每个字符的字节数,类似于您的代码:

$string = '€?A?¢';
for($i=0; $i < mb_strlen($string); $i++){
  $mbChar = mb_substr($string,$i,1);
  echo $mbChar." (".strlen($mbChar)." Byte)<br>\n";
}

输出:

€ (3 Byte)
? (4 Byte)
A (1 Byte)
? (4 Byte)
¢ (2 Byte)

这个答案更多地是为了理解。要找到一个4字节的UTF8字符,@ Dharman所示的正则表达式更短,更快。