Как заменить символы смайликов в строке?
Ответ
Иногда от пользователей может приходить текст, который при добавлению в базу mysql вызывает ошибку General error: 1366 Incorrect string value: '\xF0\x9F\x98\x8A \xD0...' for column. Все дело в некоторых символах, которые не удается сохранить в кодировке utf-8, для них нужна utf8mb4. Придется или менять кодировку, или воспользоваться функцией удаления или преобразования. Приведем два варианта: один для удаления, найденный на хабре https://habrahabr.ru/sandbox/58973/, второй из wordpress https://wp-kama.ru/function/wp_encode_emoji
Пример для удаления: clearstr('t♥e�s►t◄') == test
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
/** * Функция была взята с php.net **/ function utf8_str_split($str) { // place each character of the string into and array $split=1; $array = array(); for ( $i=0; $i < strlen( $str ); ){ $value = ord($str[$i]); if($value > 127){ if($value >= 192 && $value <= 223) $split=2; elseif($value >= 224 && $value <= 239) $split=3; elseif($value >= 240 && $value <= 247) $split=4; }else{ $split=1; } $key = NULL; for ( $j = 0; $j < $split; $j++, $i++ ) { $key .= $str[$i]; } array_push( $array, $key ); } return $array; } /** * Функция вырезки * @param <string> $str * @return <string> */ function clearstr($str){ $sru = 'ёйцукенгшщзхъфывапролджэячсмитьбю'; $s1 = array_merge(utf8_str_split($sru), utf8_str_split(strtoupper($sru)), range('A', 'Z'), range('a','z'), range('0', '9'), array('&',' ','#',';','%','?',':','(',')','-','_','=','+','[',']',',','.','/','\\')); $codes = array(); for ($i=0; $i<count($s1); $i++){ $codes[] = ord($s1[$i]); } $str_s = utf8_str_split($str); for ($i=0; $i<count($str_s); $i++){ if (!in_array(ord($str_s[$i]), $codes)){ $str = str_replace($str_s[$i], '', $str); } } return $str; } ?> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
function wp_encode_emoji( $content ) { if ( function_exists( 'mb_convert_encoding' ) ) { $regex = '/( \x23\xE2\x83\xA3 # Digits [\x30-\x39]\xE2\x83\xA3 | \xF0\x9F[\x85-\x88][\xA6-\xBF] # Enclosed characters | \xF0\x9F[\x8C-\x97][\x80-\xBF] # Misc | \xF0\x9F\x98[\x80-\xBF] # Smilies | \xF0\x9F\x99[\x80-\x8F] | \xF0\x9F\x9A[\x80-\xBF] # Transport and map symbols )/x'; $matches = array(); if ( preg_match_all( $regex, $content, $matches ) ) { if ( ! empty( $matches[1] ) ) { foreach ( $matches[1] as $emoji ) { /* * UTF-32's hex encoding is the same as HTML's hex encoding. * So, by converting the emoji from UTF-8 to UTF-32, we magically * get the correct hex encoding. */ $unpacked = unpack( 'H*', mb_convert_encoding( $emoji, 'UTF-32', 'UTF-8' ) ); if ( isset( $unpacked[1] ) ) { $entity = '&#x' . ltrim( $unpacked[1], '0' ) . ';'; $content = str_replace( $emoji, $entity, $content ); } } } } } return $content; } |