Как обнаружить 4-байтовые символы с помощью PHP - PullRequest
1 голос
/ 02 ноября 2019

Мне нужна помощь, чтобы определить, когда строка содержит 4-байтовые символы с использованием PHP. Есть ли встроенная функция или регулярное выражение, которые могут эффективно сделать это?

Я нашел эту статью, в которой говорится о замене, но я не могу найти рабочий пример, который просто обнаруживает.

Может ли php обнаруживать 4-байтовые закодированные символы utf8?

Это примерно столько, сколько я получил, но тоже не получается:

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

Ответы [ 2 ]

3 голосов
/ 02 ноября 2019

Вы можете использовать регулярное выражение для сопоставления всех символов за пределами 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);
2 голосов
/ 02 ноября 2019

Если вы работаете с символами 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, короче и быстрее.

...