Я ищу простую функцию, которая удалит символы 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);