PHP: запись простой функции removeEmoji

Я ищу простую функцию, которая удалит символы Emoji из комментариев instagram. То, что я пробовал на данный момент (с большим количеством кода из примеров, которые я нашел на SO и других сайтах):

// PHP class public static function removeEmoji($string) { // split the string into UTF8 char array // for loop inside char array // if char is emoji, remove it // endfor // return newstring } 

Любая помощь будет оценена

Я думаю, что функция preg_replace является самым простым решением.

Как предлагает EaterOfCode , я прочитал страницу wiki и закодировал новое регулярное выражение, так как ни один из ответов SO (или других сайтов), похоже, не работал для подписей на фотограммах Instagram (возвращаемый API-формат). Примечание: / u идентификатор является обязательным для соответствия символам \ x unicode.

 public static function removeEmoji($text) { $clean_text = ""; // Match Emoticons $regexEmoticons = '/[\x{1F600}-\x{1F64F}]/u'; $clean_text = preg_replace($regexEmoticons, '', $text); // Match Miscellaneous Symbols and Pictographs $regexSymbols = '/[\x{1F300}-\x{1F5FF}]/u'; $clean_text = preg_replace($regexSymbols, '', $clean_text); // Match Transport And Map Symbols $regexTransport = '/[\x{1F680}-\x{1F6FF}]/u'; $clean_text = preg_replace($regexTransport, '', $clean_text); // Match Miscellaneous Symbols $regexMisc = '/[\x{2600}-\x{26FF}]/u'; $clean_text = preg_replace($regexMisc, '', $clean_text); // Match Dingbats $regexDingbats = '/[\x{2700}-\x{27BF}]/u'; $clean_text = preg_replace($regexDingbats, '', $clean_text); return $clean_text; } 

Функция не удаляет все эмоции, так как их гораздо больше, но вы получаете точку.

Пожалуйста, обратитесь к unicode.org – полный список emoji (спасибо Epoc )

Я понимаю, что на этот вопрос уже был дан ответ и принят, но для меня это только помогло (он удалил только часть эможи). Чтобы удалить все emoji, я добавил к этому коду добавление удаления дополнительных emoji и учетных записей для селекторов вариаций Unicode. Не проводили с ним очень обширные тесты, поэтому он, вероятно, далек от совершенства и может быть не очень эффективным, но из нескольких небольших тестов, которые я сделал, похоже, удаляются все эмоции, которые предлагает IOS 7.

 <?php function remove_emoji($text){ return preg_replace('/([0-9#][\x{20E3}])|[\x{00ae}\x{00a9}\x{203C}\x{2047}\x{2048}\x{2049}\x{3030}\x{303D}\x{2139}\x{2122}\x{3297}\x{3299}][\x{FE00}-\x{FEFF}]?|[\x{2190}-\x{21FF}][\x{FE00}-\x{FEFF}]?|[\x{2300}-\x{23FF}][\x{FE00}-\x{FEFF}]?|[\x{2460}-\x{24FF}][\x{FE00}-\x{FEFF}]?|[\x{25A0}-\x{25FF}][\x{FE00}-\x{FEFF}]?|[\x{2600}-\x{27BF}][\x{FE00}-\x{FEFF}]?|[\x{2900}-\x{297F}][\x{FE00}-\x{FEFF}]?|[\x{2B00}-\x{2BF0}][\x{FE00}-\x{FEFF}]?|[\x{1F000}-\x{1F6FF}][\x{FE00}-\x{FEFF}]?/u', '', $text); } ?> 

Обновленный правильный ответ с большим количеством кодов, осталось всего несколько эмоций.

 public static function removeEmoji($text) { $clean_text = ""; // Match Emoticons $regexEmoticons = '/[\x{1F600}-\x{1F64F}]/u'; $clean_text = preg_replace($regexEmoticons, '', $text); // Match Miscellaneous Symbols and Pictographs $regexSymbols = '/[\x{1F300}-\x{1F5FF}]/u'; $clean_text = preg_replace($regexSymbols, '', $clean_text); // Match Transport And Map Symbols $regexTransport = '/[\x{1F680}-\x{1F6FF}]/u'; $clean_text = preg_replace($regexTransport, '', $clean_text); // Match Miscellaneous Symbols $regexMisc = '/[\x{2600}-\x{26FF}]/u'; $clean_text = preg_replace($regexMisc, '', $clean_text); // Match Dingbats $regexDingbats = '/[\x{2700}-\x{27BF}]/u'; $clean_text = preg_replace($regexDingbats, '', $clean_text); // Match Flags $regexDingbats = '/[\x{1F1E6}-\x{1F1FF}]/u'; $clean_text = preg_replace($regexDingbats, '', $clean_text); // Others $regexDingbats = '/[\x{1F910}-\x{1F95E}]/u'; $clean_text = preg_replace($regexDingbats, '', $clean_text); $regexDingbats = '/[\x{1F980}-\x{1F991}]/u'; $clean_text = preg_replace($regexDingbats, '', $clean_text); $regexDingbats = '/[\x{1F9C0}]/u'; $clean_text = preg_replace($regexDingbats, '', $clean_text); $regexDingbats = '/[\x{1F9F9}]/u'; $clean_text = preg_replace($regexDingbats, '', $clean_text); return $clean_text; } 

Я разработал funtcion, используя парсер из UTF-8 для ISO-8859-1 в php (который возвращает символ? Для недопустимых символов в преобразовании).

 function removeEmojis( $string ) { $string = str_replace( "?", "{%}", $string ); $string = mb_convert_encoding( $string, "ISO-8859-1", "UTF-8" ); $string = mb_convert_encoding( $string, "UTF-8", "ISO-8859-1" ); $string = str_replace( array( "?", "? ", " ?" ), array(""), $string ); $string = str_replace( "{%}", "?", $string ); return trim( $string ); } 

Объяснение:

  • конвертировать строку из utf-8 в iso-8859-1

  • вернитесь к utf-8 (функция mb_ замените недопустимые символы на ''? '' удалите недействительные символы)

  • Заменить? никому

  • Верните символ '??' Из исходной строки

Убедитесь, что вы используете UTF-8 для работы.

У нас была действительно долгая борьба с эмозисом в моей работе, мы нашли несколько регулярных выражений для этой проблемы, но никто из них не работал. Это работает:

Изменить: это не распространяется на ВСЕ эмоции. Я все еще ищу Святой Грааль из Emoji Regexp, но еще не нашел его.

 return preg_replace('/([0-9|#][\x{20E3}])|[\x{00ae}\x{00a9}\x{203C}\x{2047}\x{2048}\x{2049}\x{3030}\x{303D}\x{2139}\x{2122}\x{3297}\x{3299}][\x{FE00}-\x{FEFF}]?|[\x{2190}-\x{21FF}][\x{FE00}-\x{FEFF}]?|[\x{2300}-\x{23FF}][\x{FE00}-\x{FEFF}]?|[\x{2460}-\x{24FF}][\x{FE00}-\x{FEFF}]?|[\x{25A0}-\x{25FF}][\x{FE00}-\x{FEFF}]?|[\x{2600}-\x{27BF}][\x{FE00}-\x{FEFF}]?|[\x{2900}-\x{297F}][\x{FE00}-\x{FEFF}]?|[\x{2B00}-\x{2BF0}][\x{FE00}-\x{FEFF}]?|[\x{1F000}-\x{1F6FF}][\x{FE00}-\x{FEFF}]?/u', '', $text); 

Поскольку символы Emoji используют частную область использования юникода, вы можете использовать preg_replace() чтобы удалить всю область кодированных символов из U+E000 в U+F8FF .

 function removeEmoji($string) { return preg_replace('/&#x(e[0-9a-f][0-9a-f][0-9a-f]|f[0-8][0-9a-f][0-9a-f])/i', '', $string); } 
 function emojiFilter($text){ $text = json_encode($text); preg_match_all("/(\\\\ud83c\\\\u[0-9a-f]{4})|(\\\\ud83d\\\u[0-9a-f]{4})|(\\\\u[0-9a-f]{4})/", $text, $matchs); if(!isset($matchs[0][0])) { return json_decode($text, true); } $emoji = $matchs[0]; foreach($emoji as $ec) { $hex = substr($ec, -4); if(strlen($ec)==6) { if($hex>='2600' and $hex<='27ff') { $text = str_replace($ec, '', $text); } } else { if($hex>='dc00' and $hex<='dfff') { $text = str_replace($ec, '', $text); } } } return json_decode($text, true); } 

Вы можете просто использовать str_replace() .

 $emojiArray = array("&0123","&0234",etc. for all emoji); $strippedComment = str_replace($emojiArray,"",$originalComment);