PHP:编写一个简单的removeEmoji函数

我正在寻找一个简单的function,将从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函数是最简单的解决scheme。

正如EaterOfCodebuild议的那样,我阅读了wiki页面并编写了新的正则expression式,因为没有任何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; } 

该function不会删除所有表情符号,因为还有更多,但你明白了。

请参阅unicode.org – 完整的表情符号列表 (感谢Epoc )

我知道这个问题已经得到了答复和接受,但是对我来说唯一的一个方面是有效的(只是删除了一些表情符号)。 要删除所有的表情符号,我最终添加了这个代码,包括删除更多的表情符号和帐户的Unicode变化select器。 还没有做过非常广泛的testing,所以它可能远没有完美,可能不是很有效,但从我做的几个小testing似乎删除了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; } 

我使用UTF-8中的parsing器开发了一个funtcion,用于在PHP中使用ISO-8859-1(在转换中返回一个无效字符的?字符)。

 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 ); } 

说明:

  • 将string从utf-8转换为iso-8859-1

  • 返回到utf-8(mb_函数将无效字符replace为“'?”删除无效字符)

  • replace? 没有

  • 从原始string中返回“?”字符

确保你正在使用UTF-8工作。

在我的工作中,我们与emojis进行了很长时间的争斗,我们发现了这个问题的一些正则expression式,但是他们都没有工作。 这一个工作:

编辑:这不包括所有的表情符号。 我仍然在寻找Emoji Regexp的圣杯,但还没有find它。

 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字符使用unicode的专用区域,因此可以使用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);