Я использую таблицы mysql utf8 charset на сервере mysql 5.1, который не поддерживает кодировку utf8mb4 в таблицах. При вставке 4- "𡃁","𨋢","𠵱","𥄫","𠽌","唧","𠱁"
кодированных символов utf8, таких как "𡃁","𨋢","𠵱","𥄫","𠽌","唧","𠱁"
. В таблице появится всплывающая ошибка или пропустите следующие тексты.
Как я могу программно обнаружить 4-байтовые кодированные символы utf8 в PHP и заменить их?
Следующее регулярное выражение заменит 4-байтные символы UTF-8:
function replace4byte($string) { return preg_replace('%(?: \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3 | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15 | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16 )%xs', '', $string); } var_dump(replace4byte('d'), replace4byte('d𡃁d'));
Это не зависит от модификатора /u
, поэтому вам не нужно беспокоиться о UTF-8 для компиляции PCRE. Однако, если у вас есть эта поддержка, preg_replace_callback preg_replace_callback
является более аккуратным.
(Regex адаптирован для обеспечения правильности utf-8 в PHP )
Это должно работать:
if (max(array_map('ord', str_split($string))) >= 240)
Рациональное то, что код указывает и включает U + FFFF, кодируется как три байта формы 1110xxxx 10xxxxxx 10xxxxxx
. Более высокие кодовые точки имеют форму 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
, то есть старший байт имеет значение 240 или выше. Если в строке есть такие байты, это индикатор для 4-байтовой последовательности.
Если вы хотите удалить длинные символы, это будет делать:
preg_replace_callback('/./u', function (array $match) { return strlen($match[0]) >= 4 ? null : $match[0]; }, $string)
Хотя может быть более элегантный способ регулярного выражения для прямого выражения высоких кодовых точек.