我需要帮助来使用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";
}
}
答案 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所示的正则表达式更短,更快。