Вы можете использовать регулярное выражение для сопоставления всех символов за пределами BMP, которые являются всеми символами в пространстве Юникода выше U+FFFF
$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);