【问题标题】:PHP : writing a simple removeEmoji functionPHP:编写一个简单的 removeEmoji 函数
【发布时间】:2023-03-31 18:17:01
【问题描述】:

我正在寻找一个简单的功能,可以从 instagram cmets 中删除 Emoji 字符。我现在尝试过的(我在 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
}

任何帮助将不胜感激

【问题讨论】:

  • 请更深入地告诉我们您尝试了什么,因为这并没有真正说明什么。为什么你的代码不起作用?你的输出是什么?它与预期输出相比如何?
  • en.wikipedia.org/wiki/Emoji 请先阅读本文
  • @JonTaylor 我尝试了在 SO 上找到的不同解决方案。实际上,似乎没有一个效果很好。
  • 如果您仍在使用此功能并且发现 IOS 7 中的某些表情符号没有被删除,请查看我刚刚发布的答案,该答案对您的答案进行了扩展。

标签: php instagram emoji


【解决方案1】:

我认为 preg_replace 函数是最简单的解决方案。

正如EaterOfCode 建议的那样,我阅读了wiki page 并编写了新的正则表达式,因为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 - full emoji list(感谢Epoc

【讨论】:

  • 你自己修好了!我为你感到骄傲;)(我知道我有点晚了)
  • 如何删除 utf-8 字符串中的表情符号? utf-8 中的大多数表情符号都以 \xf0\x9f 开头。
  • 这样更快$clean_text = preg_replace('/[\x{1F600}-\x{1F64F}\x{1F300}-\x{1F5FF}\x{1F680}-\x{1F6FF}\x{2600}-\x{26FF}\x{2700}-\x{27BF}]+/u', '', $text);
  • 仅供参考,完整的表情符号列表可用here(Unicode 联盟的官方列表)
  • 您的函数不会删除此表情符号:??️??️? 您可以通过从 Emoji 11 规范中获取准备好的间隔来改进您的正则表达式。 unicode.org/Public/emoji/11.0/emoji-data.txt
【解决方案2】:

随着苹果继续在新版本的 ios 中添加表情符号,我将更新和维护这个答案。

此答案已针对 ios 12.1 进行了更新。如果您有问题,请检查此答案以前版本的编辑历史记录(此答案中有多个正则表达式超过了 SO 的最大帖子正文长度)

iOS 12.1 测试版(2018 年 11 月)

public static function removeEmoji($string)
    return preg_replace('/[\x{1F3F4}](?:\x{E0067}\x{E0062}\x{E0077}\x{E006C}\x{E0073}\x{E007F})|[\x{1F3F4}](?:\x{E0067}\x{E0062}\x{E0073}\x{E0063}\x{E0074}\x{E007F})|[\x{1F3F4}](?:\x{E0067}\x{E0062}\x{E0065}\x{E006E}\x{E0067}\x{E007F})|[\x{1F3F4}](?:\x{200D}\x{2620}\x{FE0F})|[\x{1F3F3}](?:\x{FE0F}\x{200D}\x{1F308})|[\x{0023}\x{002A}\x{0030}\x{0031}\x{0032}\x{0033}\x{0034}\x{0035}\x{0036}\x{0037}\x{0038}\x{0039}](?:\x{FE0F}\x{20E3})|[\x{1F415}](?:\x{200D}\x{1F9BA})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F467}\x{200D}\x{1F467})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F467}\x{200D}\x{1F466})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F467})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F466}\x{200D}\x{1F466})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F466})|[\x{1F468}](?:\x{200D}\x{1F468}\x{200D}\x{1F467}\x{200D}\x{1F467})|[\x{1F468}](?:\x{200D}\x{1F468}\x{200D}\x{1F466}\x{200D}\x{1F466})|[\x{1F468}](?:\x{200D}\x{1F468}\x{200D}\x{1F467}\x{200D}\x{1F466})|[\x{1F468}](?:\x{200D}\x{1F468}\x{200D}\x{1F467})|[\x{1F468}](?:\x{200D}\x{1F468}\x{200D}\x{1F466})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F469}\x{200D}\x{1F467}\x{200D}\x{1F467})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F469}\x{200D}\x{1F466}\x{200D}\x{1F466})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F469}\x{200D}\x{1F467}\x{200D}\x{1F466})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F469}\x{200D}\x{1F467})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F469}\x{200D}\x{1F466})|[\x{1F469}](?:\x{200D}\x{2764}\x{FE0F}\x{200D}\x{1F469})|[\x{1F469}\x{1F468}](?:\x{200D}\x{2764}\x{FE0F}\x{200D}\x{1F468})|[\x{1F469}](?:\x{200D}\x{2764}\x{FE0F}\x{200D}\x{1F48B}\x{200D}\x{1F469})|[\x{1F469}\x{1F468}](?:\x{200D}\x{2764}\x{FE0F}\x{200D}\x{1F48B}\x{200D}\x{1F468})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F9BD})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F9BC})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F9AF})|[\x{1F575}\x{1F3CC}\x{26F9}\x{1F3CB}](?:\x{FE0F}\x{200D}\x{2640}\x{FE0F})|[\x{1F575}\x{1F3CC}\x{26F9}\x{1F3CB}](?:\x{FE0F}\x{200D}\x{2642}\x{FE0F})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F692})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F680})|[\x{1F468}\x{1F469}](?:\x{200D}\x{2708}\x{FE0F})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F3A8})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F3A4})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F4BB})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F52C})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F4BC})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F3ED})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F527})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F373})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F33E})|[\x{1F468}\x{1F469}](?:\x{200D}\x{2696}\x{FE0F})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F3EB})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F393})|[\x{1F468}\x{1F469}](?:\x{200D}\x{2695}\x{FE0F})|[\x{1F471}\x{1F64D}\x{1F64E}\x{1F645}\x{1F646}\x{1F481}\x{1F64B}\x{1F9CF}\x{1F647}\x{1F926}\x{1F937}\x{1F46E}\x{1F482}\x{1F477}\x{1F473}\x{1F9B8}\x{1F9B9}\x{1F9D9}\x{1F9DA}\x{1F9DB}\x{1F9DC}\x{1F9DD}\x{1F9DE}\x{1F9DF}\x{1F486}\x{1F487}\x{1F6B6}\x{1F9CD}\x{1F9CE}\x{1F3C3}\x{1F46F}\x{1F9D6}\x{1F9D7}\x{1F3C4}\x{1F6A3}\x{1F3CA}\x{1F6B4}\x{1F6B5}\x{1F938}\x{1F93C}\x{1F93D}\x{1F93E}\x{1F939}\x{1F9D8}](?:\x{200D}\x{2640}\x{FE0F})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F9B2})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F9B3})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F9B1})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F9B0})|[\x{1F471}\x{1F64D}\x{1F64E}\x{1F645}\x{1F646}\x{1F481}\x{1F64B}\x{1F9CF}\x{1F647}\x{1F926}\x{1F937}\x{1F46E}\x{1F482}\x{1F477}\x{1F473}\x{1F9B8}\x{1F9B9}\x{1F9D9}\x{1F9DA}\x{1F9DB}\x{1F9DC}\x{1F9DD}\x{1F9DE}\x{1F9DF}\x{1F486}\x{1F487}\x{1F6B6}\x{1F9CD}\x{1F9CE}\x{1F3C3}\x{1F46F}\x{1F9D6}\x{1F9D7}\x{1F3C4}\x{1F6A3}\x{1F3CA}\x{1F6B4}\x{1F6B5}\x{1F938}\x{1F93C}\x{1F93D}\x{1F93E}\x{1F939}\x{1F9D8}](?:\x{200D}\x{2642}\x{FE0F})|[\x{1F441}](?:\x{FE0F}\x{200D}\x{1F5E8}\x{FE0F})|[\x{1F1E6}\x{1F1E7}\x{1F1E8}\x{1F1E9}\x{1F1F0}\x{1F1F2}\x{1F1F3}\x{1F1F8}\x{1F1F9}\x{1F1FA}](?:\x{1F1FF})|[\x{1F1E7}\x{1F1E8}\x{1F1EC}\x{1F1F0}\x{1F1F1}\x{1F1F2}\x{1F1F5}\x{1F1F8}\x{1F1FA}](?:\x{1F1FE})|[\x{1F1E6}\x{1F1E8}\x{1F1F2}\x{1F1F8}](?:\x{1F1FD})|[\x{1F1E6}\x{1F1E7}\x{1F1E8}\x{1F1EC}\x{1F1F0}\x{1F1F2}\x{1F1F5}\x{1F1F7}\x{1F1F9}\x{1F1FF}](?:\x{1F1FC})|[\x{1F1E7}\x{1F1E8}\x{1F1F1}\x{1F1F2}\x{1F1F8}\x{1F1F9}](?:\x{1F1FB})|[\x{1F1E6}\x{1F1E8}\x{1F1EA}\x{1F1EC}\x{1F1ED}\x{1F1F1}\x{1F1F2}\x{1F1F3}\x{1F1F7}\x{1F1FB}](?:\x{1F1FA})|[\x{1F1E6}\x{1F1E7}\x{1F1EA}\x{1F1EC}\x{1F1ED}\x{1F1EE}\x{1F1F1}\x{1F1F2}\x{1F1F5}\x{1F1F8}\x{1F1F9}\x{1F1FE}](?:\x{1F1F9})|[\x{1F1E6}\x{1F1E7}\x{1F1EA}\x{1F1EC}\x{1F1EE}\x{1F1F1}\x{1F1F2}\x{1F1F5}\x{1F1F7}\x{1F1F8}\x{1F1FA}\x{1F1FC}](?:\x{1F1F8})|[\x{1F1E6}\x{1F1E7}\x{1F1E8}\x{1F1EA}\x{1F1EB}\x{1F1EC}\x{1F1ED}\x{1F1EE}\x{1F1F0}\x{1F1F1}\x{1F1F2}\x{1F1F3}\x{1F1F5}\x{1F1F8}\x{1F1F9}](?:\x{1F1F7})|[\x{1F1E6}\x{1F1E7}\x{1F1EC}\x{1F1EE}\x{1F1F2}](?:\x{1F1F6})|[\x{1F1E8}\x{1F1EC}\x{1F1EF}\x{1F1F0}\x{1F1F2}\x{1F1F3}](?:\x{1F1F5})|[\x{1F1E6}\x{1F1E7}\x{1F1E8}\x{1F1E9}\x{1F1EB}\x{1F1EE}\x{1F1EF}\x{1F1F2}\x{1F1F3}\x{1F1F7}\x{1F1F8}\x{1F1F9}](?:\x{1F1F4})|[\x{1F1E7}\x{1F1E8}\x{1F1EC}\x{1F1ED}\x{1F1EE}\x{1F1F0}\x{1F1F2}\x{1F1F5}\x{1F1F8}\x{1F1F9}\x{1F1FA}\x{1F1FB}](?:\x{1F1F3})|[\x{1F1E6}\x{1F1E7}\x{1F1E8}\x{1F1E9}\x{1F1EB}\x{1F1EC}\x{1F1ED}\x{1F1EE}\x{1F1EF}\x{1F1F0}\x{1F1F2}\x{1F1F4}\x{1F1F5}\x{1F1F8}\x{1F1F9}\x{1F1FA}\x{1F1FF}](?:\x{1F1F2})|[\x{1F1E6}\x{1F1E7}\x{1F1E8}\x{1F1EC}\x{1F1EE}\x{1F1F2}\x{1F1F3}\x{1F1F5}\x{1F1F8}\x{1F1F9}](?:\x{1F1F1})|[\x{1F1E8}\x{1F1E9}\x{1F1EB}\x{1F1ED}\x{1F1F1}\x{1F1F2}\x{1F1F5}\x{1F1F8}\x{1F1F9}\x{1F1FD}](?:\x{1F1F0})|[\x{1F1E7}\x{1F1E9}\x{1F1EB}\x{1F1F8}\x{1F1F9}](?:\x{1F1EF})|[\x{1F1E6}\x{1F1E7}\x{1F1E8}\x{1F1EB}\x{1F1EC}\x{1F1F0}\x{1F1F1}\x{1F1F3}\x{1F1F8}\x{1F1FB}](?:\x{1F1EE})|[\x{1F1E7}\x{1F1E8}\x{1F1EA}\x{1F1EC}\x{1F1F0}\x{1F1F2}\x{1F1F5}\x{1F1F8}\x{1F1F9}](?:\x{1F1ED})|[\x{1F1E6}\x{1F1E7}\x{1F1E8}\x{1F1E9}\x{1F1EA}\x{1F1EC}\x{1F1F0}\x{1F1F2}\x{1F1F3}\x{1F1F5}\x{1F1F8}\x{1F1F9}\x{1F1FA}\x{1F1FB}](?:\x{1F1EC})|[\x{1F1E6}\x{1F1E7}\x{1F1E8}\x{1F1EC}\x{1F1F2}\x{1F1F3}\x{1F1F5}\x{1F1F9}\x{1F1FC}](?:\x{1F1EB})|[\x{1F1E6}\x{1F1E7}\x{1F1E9}\x{1F1EA}\x{1F1EC}\x{1F1EE}\x{1F1EF}\x{1F1F0}\x{1F1F2}\x{1F1F3}\x{1F1F5}\x{1F1F7}\x{1F1F8}\x{1F1FB}\x{1F1FE}](?:\x{1F1EA})|[\x{1F1E6}\x{1F1E7}\x{1F1E8}\x{1F1EC}\x{1F1EE}\x{1F1F2}\x{1F1F8}\x{1F1F9}](?:\x{1F1E9})|[\x{1F1E6}\x{1F1E8}\x{1F1EA}\x{1F1EE}\x{1F1F1}\x{1F1F2}\x{1F1F3}\x{1F1F8}\x{1F1F9}\x{1F1FB}](?:\x{1F1E8})|[\x{1F1E7}\x{1F1EC}\x{1F1F1}\x{1F1F8}](?:\x{1F1E7})|[\x{1F1E7}\x{1F1E8}\x{1F1EA}\x{1F1EC}\x{1F1F1}\x{1F1F2}\x{1F1F3}\x{1F1F5}\x{1F1F6}\x{1F1F8}\x{1F1F9}\x{1F1FA}\x{1F1FB}\x{1F1FF}](?:\x{1F1E6})|[\x{00A9}\x{00AE}\x{203C}\x{2049}\x{2122}\x{2139}\x{2194}-\x{2199}\x{21A9}-\x{21AA}\x{231A}-\x{231B}\x{2328}\x{23CF}\x{23E9}-\x{23F3}\x{23F8}-\x{23FA}\x{24C2}\x{25AA}-\x{25AB}\x{25B6}\x{25C0}\x{25FB}-\x{25FE}\x{2600}-\x{2604}\x{260E}\x{2611}\x{2614}-\x{2615}\x{2618}\x{261D}\x{2620}\x{2622}-\x{2623}\x{2626}\x{262A}\x{262E}-\x{262F}\x{2638}-\x{263A}\x{2640}\x{2642}\x{2648}-\x{2653}\x{265F}-\x{2660}\x{2663}\x{2665}-\x{2666}\x{2668}\x{267B}\x{267E}-\x{267F}\x{2692}-\x{2697}\x{2699}\x{269B}-\x{269C}\x{26A0}-\x{26A1}\x{26AA}-\x{26AB}\x{26B0}-\x{26B1}\x{26BD}-\x{26BE}\x{26C4}-\x{26C5}\x{26C8}\x{26CE}-\x{26CF}\x{26D1}\x{26D3}-\x{26D4}\x{26E9}-\x{26EA}\x{26F0}-\x{26F5}\x{26F7}-\x{26FA}\x{26FD}\x{2702}\x{2705}\x{2708}-\x{270D}\x{270F}\x{2712}\x{2714}\x{2716}\x{271D}\x{2721}\x{2728}\x{2733}-\x{2734}\x{2744}\x{2747}\x{274C}\x{274E}\x{2753}-\x{2755}\x{2757}\x{2763}-\x{2764}\x{2795}-\x{2797}\x{27A1}\x{27B0}\x{27BF}\x{2934}-\x{2935}\x{2B05}-\x{2B07}\x{2B1B}-\x{2B1C}\x{2B50}\x{2B55}\x{3030}\x{303D}\x{3297}\x{3299}\x{1F004}\x{1F0CF}\x{1F170}-\x{1F171}\x{1F17E}-\x{1F17F}\x{1F18E}\x{1F191}-\x{1F19A}\x{1F201}-\x{1F202}\x{1F21A}\x{1F22F}\x{1F232}-\x{1F23A}\x{1F250}-\x{1F251}\x{1F300}-\x{1F321}\x{1F324}-\x{1F393}\x{1F396}-\x{1F397}\x{1F399}-\x{1F39B}\x{1F39E}-\x{1F3F0}\x{1F3F3}-\x{1F3F5}\x{1F3F7}-\x{1F3FA}\x{1F400}-\x{1F4FD}\x{1F4FF}-\x{1F53D}\x{1F549}-\x{1F54E}\x{1F550}-\x{1F567}\x{1F56F}-\x{1F570}\x{1F573}-\x{1F57A}\x{1F587}\x{1F58A}-\x{1F58D}\x{1F590}\x{1F595}-\x{1F596}\x{1F5A4}-\x{1F5A5}\x{1F5A8}\x{1F5B1}-\x{1F5B2}\x{1F5BC}\x{1F5C2}-\x{1F5C4}\x{1F5D1}-\x{1F5D3}\x{1F5DC}-\x{1F5DE}\x{1F5E1}\x{1F5E3}\x{1F5E8}\x{1F5EF}\x{1F5F3}\x{1F5FA}-\x{1F64F}\x{1F680}-\x{1F6C5}\x{1F6CB}-\x{1F6D2}\x{1F6D5}\x{1F6E0}-\x{1F6E5}\x{1F6E9}\x{1F6EB}-\x{1F6EC}\x{1F6F0}\x{1F6F3}-\x{1F6FA}\x{1F7E0}-\x{1F7EB}\x{1F90D}-\x{1F93A}\x{1F93C}-\x{1F945}\x{1F947}-\x{1F971}\x{1F973}-\x{1F976}\x{1F97A}-\x{1F9A2}\x{1F9A5}-\x{1F9AA}\x{1F9AE}-\x{1F9CA}\x{1F9CD}-\x{1F9FF}\x{1FA70}-\x{1FA73}\x{1FA78}-\x{1FA7A}\x{1FA80}-\x{1FA82}\x{1FA90}-\x{1FA95}]/u', '', $string);
}

【讨论】:

  • 这也是唯一对我有用的。非常感谢!
  • 对我来说也一样。第一个(接受的答案)删除了许多符号,但不是全部。据我所知,这是在做的伎俩,不过!谢谢!
  • 这非常有效,但它也删除了管道符号 |
  • @Christian 看起来我那里有一些流浪的| 字符。我已经更新了它,它不应该再这样做了
  • iOS 10 拥有更多疯狂的表情乐趣。有些表情符号实际上是两个。 EG:iOS10 金发男人举起一只手 = ??‍♂️
【解决方案3】:

用更多代码更新了正确答案,只剩下几个表情符号了。

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

【讨论】:

  • 你不能只更新正确答案而不是发布一个伪新答案吗?
  • 对答案投反对票并没有什么坏处。无论如何,我认为这是公平的,因为它是对不属于您的答案的重新发布。如果您想贡献(通过更新或其他方式)并且发现自己对如何贡献有疑问,请先在 Meta Stack Overflow 上搜索(或询问)。希望这会有所帮助。
  • 是的,它可以工作,但它也会删除换行符,我该如何解决?
  • 例如不适用于?
【解决方案4】:

也可以使用 iconv 删除表情符号。 它与此线程中基于 mb_convert_encoding 的解决方案非常相似,但 iconv 提供了 //IGNORE 选项,因此无需保护/恢复“?”。 表情符号被替换为空格,因此该功能是将多个连续的空格替换为一个。

它只适用于拉丁 9 + 表情符号的文本

但是:

  • 它比最佳答案快约 100 倍(截至 2020 年 12 月),
  • 对于拉丁文本,它更可靠(最好的答案是用一些“深肤色”表情符号留下不需要的字符,例如 ?? ??‍♂️ ?? ??‍♂️ ?? ??‍♂️ ??‍♀️ ??‍♂️ ??‍♀️ ??‍♂️ ?? ??‍♂️ ?? ??‍♂️ ?? ??‍♂️,甚至?),
  • 未来的表情符号也将被移除。
function removeEmoji(string $text): string
{
    $text = iconv('UTF-8', 'ISO-8859-15//IGNORE', $text);
    $text = preg_replace('/\s+/', ' ', $text);
    return iconv('ISO-8859-15', 'UTF-8', $text);
}

【讨论】:

  • 谢谢,此修复适用于所有表情符号!
【解决方案5】:

我使用来自 UTF-8 的解析器为 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 );
}

解释:

  • 将字符串从 utf-8 转换为 iso-8859-1

  • 返回utf-8(mb_函数替换无效字符为''?''去除无效字符)

  • 替换?没有

  • 从原始字符串中返回''?''字符

确保您使用 UTF-8 来工作。

【讨论】:

  • 记得在使用它之前查找 ISO-8859-1 字符集。 ISO-8859-1 是一个非常有限的字符集。这种方法比公认的答案要快得多,但它也比表情符号的要多得多。
  • 如果有怎么办? $string中的字符
  • @ChristoKiwi 您可以在进行此转换之前将它们转义,或将它们保存在其他地方
  • 嘿,这对蛞蝓非常有效。通过 iconv 方法导致内存堆错误的输入完全可以解决这个问题,谢谢!
【解决方案6】:

使用以下模式删除所有表情符号

function removeEmoji($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{2600}-\x{27BF}][\x{1F000}-\x{1FEFF}]?|[\x{2900}-\x{297F}][\x{FE00}-\x{FEFF}]?|[\x{2B00}-\x{2BF0}][\x{FE00}-\x{FEFF}]?|[\x{1F000}-\x{1F9FF}][\x{FE00}-\x{FEFF}]?|[\x{1F000}-\x{1F9FF}][\x{1F000}-\x{1FEFF}]?/u', '', $text);
}

refrence

【讨论】:

    【解决方案7】:

    虽然所有这些方法都是有效的,但它们从根本上说是对正则表达式的字符的阻止列表:这很难维护,而且容易出错。

    表情符号实际上是各种不同的代码块之一,它们在网络和其他地方被广泛用作图标:Miscellaneous Symbols and PictographsEmoticonsTransport and Map Symbols 只是最常用的,但我可以继续使用麻将等符号瓷砖和炼金术,都属于辅助多语言位面。

    Unicode 具有用于分配代码点(即符号编码)的明确结构,该结构可能不会随版本而改变,您可以很好地利用这一点:

    • 在 1F000 和 1F0FF 之间,您只能 - 找到游戏符号
    • 在 1F300 和 1FBFF 之间 - 永远 - 找不到字母或语言书写符号,无论是封闭的还是其他的
    • 在 E0000 和 E007D 之间,您会发现神秘的 Tags 代码块:当被 1F3F4(即:?)和 E007F 封装时,它们允许渲染标志,充当修改字符。如果你过滤掉黑旗,也把这个过滤掉!

    因此,请改用对多字节字符串安全的 hacky preg_replaces 实现(这就是我们有 mb_ereg_replace 的原因),而是使用 Intl 模块:

    /**
      * Removes all characters within a Unicode codepoint range, *extremes included*, from a given UTF-8 string
      * @param string $text The text to filter
      * @param int $rangeStart The beginning of the Unicode range
      * @param int $rangeEnd The end of the Unicode range
      * @return string The filtered string
     */
    function SanifyUnicodeRange(string $input, int $rangeStart, int $rangeEnd) {
         /*
         If you have php >= 7.4, use mb_str_split in place of the following 7 lines 
         If you are using another UTF encoding and you're not using mb_str_split, 
         remember to change it below
         */
         $inputLength = mb_strlen($input);
         $charactersArray = array();
         while ($inputLength) { 
             $charactersArray[] = mb_substr($input, 0, 1, "UTF-8");
             $input = mb_substr($input, 1, $inputLength, "UTF-8"); 
             $inputLength = mb_strlen($input);
         }
         //Iterate over the characters array, and implode (which is mb-safe) it back into a string
         return implode('', array_filter($charactersArray, function ($unicodeCharacter) use ($rangeStart, $rangeEnd) {
             $codePoint = IntlChar::ord($unicodeCharacter);
             //Does it fall within the code block we're filtering?
             return ($codePoint < $rangeStart || $codePoint > $rangeEnd);
         }));
     }
    

    【讨论】:

      【解决方案8】:

      在我的工作中,我们与表情符号进行了长期斗争,我们找到了一些解决这个问题的正则表达式,但没有一个有效。 这个正在工作:

      编辑:这并不涵盖所有的表情符号。我还在寻找表情符号正则表达式的圣杯,但还没有找到。

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

      【讨论】:

      • 这适用于所有现有的表情符号?
      • 嗯,我能找到的每一个。它并没有涵盖所有这些。我想可能是 80%。
      【解决方案9】:

      这是一个简单的正则表达式,但支持一切!

      $re = '/[
      (\x{1F600}-\x{1F64F})|
      (\x{2700}-\x{27BF})|
      (\x{1F680}-\x{1F6FF})|
      (\x{24C2}-\x{1F251})|
      (\x{1F30D}-\x{1F567})|
      (\x{1F900}-\x{1F9FF})|
      (\x{1F300}-\x{1F5FF})
      ]/mu';
      

      here (regex101)查看结果。

      所以你的php函数可以是:

      function removeEmojis($input) {
          $re = '/[
      (\x{1F600}-\x{1F64F})|
      (\x{2700}-\x{27BF})|
      (\x{1F680}-\x{1F6FF})|
      (\x{24C2}-\x{1F251})|
      (\x{1F30D}-\x{1F567})|
      (\x{1F900}-\x{1F9FF})|
      (\x{1F300}-\x{1F5FF})
      ]/mu';
          $result = preg_replace($re, "", $input);
          return $result;
      }
      

      【讨论】:

      • 你的正则表达式也匹配空格
      • @Andrea 你确定吗?我在 regex101 上检查了它(答案中提到了它的链接),但似乎与空格不匹配。
      • 请仔细检查您的 regex101 链接:匹配项:- 111(在“People”之前)- 112(在“People”和“and”之间)- 113(在“and”和“fantasy”之间)
      • @Erfun 几乎完美 THX !你能解释一下它是如何工作的吗?你能看看这个表情符号列表吗:regextester.com/106421 ==> 几乎所有表情符号都被你的正则表达式检测到(我不知道在哪里可以找到包含所有表情符号的列表)。
      【解决方案10】:

      我已经通过使用 WordPress 用图像替换表情符号的相同代码解决了这个问题

      这是我使用的代码,它运行良好,因为它包含最常用表情符号的完整列表

      完整代码在这里https://pastebin.com/8MqGdD6p

      这是它的工作原理,但请确保从 pastebin 复制代码,因为这是不完整的代码

      $content ='<span class="do">⚫</span> where emojis exist';
      $partials = array('&#x1f469;&#x200d;); // the list of emojis 
      
      foreach ( $partials as $emojum ) {
          if ( version_compare( phpversion(), '5.4', '<' ) ) {
              $emoji_char = html_entity_decode( $emojum, ENT_COMPAT, 'UTF-8' );
          } else {
              $emoji_char = html_entity_decode( $emojum );
          }
          if ( false !== strpos( $content, $emoji_char ) ) {
              $content = preg_replace( "/$emoji_char/", '', $content );
          }
      }
      

      【讨论】:

        【解决方案11】:

        PHP 删除 Emoji 或 4 字节字符

        表情符号或 BMP 字符超过三个字节,每个字符最多四个字节。要存储这种类型的字符,MySQL 中需要 UTF8mb4 字符集。并且仅在 MySQL 5.5.3 及以上版本中可用。

        否则,删除所有 4 字节字符并将其存储在 DB 中。示例脚本如下:

        #to remove 4byte characters like emojis etc..
        function replace_4byte($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);    
        }
        

        测试:

        $string = "We test those emojis ? ? ?? ? ?";
        $string = replace_4byte($string);
        echo $string;
        

        输出:

        We test those emojis


        学分转到http://scriptsof.com/php-remove-emojis-or-4-byte-characters-19

        【讨论】:

          【解决方案12】:

          由于 Emoji 字符使用 unicode 的私人使用区域,您可以使用 preg_replace() 删除从 U+E000U+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);
          }
          

          【讨论】:

          • 试一试你的函数,但它不能替换该示例字符串中的表情符号:回到美国???
          • 你能粘贴一个包含表情符号的 instagram cmets 的 html 编码示例吗?
          • Instagram API 返回纯文本/文本字符串。无论如何,我已经回答了我自己的问题,请参阅我的回复。感谢您的帮助:)
          【解决方案13】:
          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);  }
          

          【讨论】:

          • 如果您可以在其中添加一些 cmets 以帮助了解其工作原理,那将会很有用。
          【解决方案14】:

          @sglessard 因为代码已经过时,这里是 2018 年 7 月 12 日所有表情符号的完整列表 您将能够通过运行我发布的源代码来生成它

          如果您发现任何问题,请告诉我,谢谢。

          public static function removeEmoji($text) {
              $regexEmoticons = [
                  '/[\x{0023}]/u',
                  '/[\x{002A}]/u',
                  '/[\x{00A9}]/u',
                  '/[\x{00AE}]/u',
                  '/[\x{200D}]/u',
                  '/[\x{203C}]/u',
                  '/[\x{2049}]/u',
                  '/[\x{20E3}]/u',
                  '/[\x{2122}]/u',
                  '/[\x{2139}]/u',
                  '/[\x{2194}-\x{2199}]/u',
                  '/[\x{21A9}-\x{21AA}]/u',
                  '/[\x{231A}-\x{231B}]/u',
                  '/[\x{2328}]/u',
                  '/[\x{23CF}]/u',
                  '/[\x{23E9}-\x{23F3}]/u',
                  '/[\x{23F8}-\x{23FA}]/u',
                  '/[\x{24C2}]/u',
                  '/[\x{25AA}-\x{25AB}]/u',
                  '/[\x{25B6}]/u',
                  '/[\x{25C0}]/u',
                  '/[\x{25FB}-\x{25FE}]/u',
                  '/[\x{2600}-\x{2604}]/u',
                  '/[\x{260E}]/u',
                  '/[\x{2611}]/u',
                  '/[\x{2614}-\x{2615}]/u',
                  '/[\x{2618}]/u',
                  '/[\x{261D}]/u',
                  '/[\x{2620}]/u',
                  '/[\x{2622}-\x{2623}]/u',
                  '/[\x{2626}]/u',
                  '/[\x{262A}]/u',
                  '/[\x{262E}-\x{262F}]/u',
                  '/[\x{2638}-\x{263A}]/u',
                  '/[\x{2640}]/u',
                  '/[\x{2642}]/u',
                  '/[\x{2648}-\x{2653}]/u',
                  '/[\x{265F}-\x{2660}]/u',
                  '/[\x{2663}]/u',
                  '/[\x{2665}-\x{2666}]/u',
                  '/[\x{2668}]/u',
                  '/[\x{267B}]/u',
                  '/[\x{267E}-\x{267F}]/u',
                  '/[\x{2692}-\x{2697}]/u',
                  '/[\x{2699}]/u',
                  '/[\x{269B}-\x{269C}]/u',
                  '/[\x{26A0}-\x{26A1}]/u',
                  '/[\x{26AA}-\x{26AB}]/u',
                  '/[\x{26B0}-\x{26B1}]/u',
                  '/[\x{26BD}-\x{26BE}]/u',
                  '/[\x{26C4}-\x{26C5}]/u',
                  '/[\x{26C8}]/u',
                  '/[\x{26CE}-\x{26CF}]/u',
                  '/[\x{26D1}]/u',
                  '/[\x{26D3}-\x{26D4}]/u',
                  '/[\x{26E9}-\x{26EA}]/u',
                  '/[\x{26F0}-\x{26F5}]/u',
                  '/[\x{26F7}-\x{26FA}]/u',
                  '/[\x{26FD}]/u',
                  '/[\x{2702}]/u',
                  '/[\x{2705}]/u',
                  '/[\x{2708}-\x{270D}]/u',
                  '/[\x{270F}]/u',
                  '/[\x{2712}]/u',
                  '/[\x{2714}]/u',
                  '/[\x{2716}]/u',
                  '/[\x{271D}]/u',
                  '/[\x{2721}]/u',
                  '/[\x{2728}]/u',
                  '/[\x{2733}-\x{2734}]/u',
                  '/[\x{2744}]/u',
                  '/[\x{2747}]/u',
                  '/[\x{274C}]/u',
                  '/[\x{274E}]/u',
                  '/[\x{2753}-\x{2755}]/u',
                  '/[\x{2757}]/u',
                  '/[\x{2763}-\x{2764}]/u',
                  '/[\x{2795}-\x{2797}]/u',
                  '/[\x{27A1}]/u',
                  '/[\x{27B0}]/u',
                  '/[\x{27BF}]/u',
                  '/[\x{2934}-\x{2935}]/u',
                  '/[\x{2B05}-\x{2B07}]/u',
                  '/[\x{2B1B}-\x{2B1C}]/u',
                  '/[\x{2B50}]/u',
                  '/[\x{2B55}]/u',
                  '/[\x{3030}]/u',
                  '/[\x{303D}]/u',
                  '/[\x{3297}]/u',
                  '/[\x{3299}]/u',
                  '/[\x{FE0F}]/u',
                  '/[\x{1F004}]/u',
                  '/[\x{1F0CF}]/u',
                  '/[\x{1F170}-\x{1F171}]/u',
                  '/[\x{1F17E}-\x{1F17F}]/u',
                  '/[\x{1F18E}]/u',
                  '/[\x{1F191}-\x{1F19A}]/u',
                  '/[\x{1F1E6}-\x{1F1FF}]/u',
                  '/[\x{1F201}-\x{1F202}]/u',
                  '/[\x{1F21A}]/u',
                  '/[\x{1F22F}]/u',
                  '/[\x{1F232}-\x{1F23A}]/u',
                  '/[\x{1F250}-\x{1F251}]/u',
                  '/[\x{1F300}-\x{1F321}]/u',
                  '/[\x{1F324}-\x{1F393}]/u',
                  '/[\x{1F396}-\x{1F397}]/u',
                  '/[\x{1F399}-\x{1F39B}]/u',
                  '/[\x{1F39E}-\x{1F3F0}]/u',
                  '/[\x{1F3F3}-\x{1F3F5}]/u',
                  '/[\x{1F3F7}-\x{1F3FA}]/u',
                  '/[\x{1F400}-\x{1F4FD}]/u',
                  '/[\x{1F4FF}-\x{1F53D}]/u',
                  '/[\x{1F549}-\x{1F54E}]/u',
                  '/[\x{1F550}-\x{1F567}]/u',
                  '/[\x{1F56F}-\x{1F570}]/u',
                  '/[\x{1F573}-\x{1F57A}]/u',
                  '/[\x{1F587}]/u',
                  '/[\x{1F58A}-\x{1F58D}]/u',
                  '/[\x{1F590}]/u',
                  '/[\x{1F595}-\x{1F596}]/u',
                  '/[\x{1F5A4}-\x{1F5A5}]/u',
                  '/[\x{1F5A8}]/u',
                  '/[\x{1F5B1}-\x{1F5B2}]/u',
                  '/[\x{1F5BC}]/u',
                  '/[\x{1F5C2}-\x{1F5C4}]/u',
                  '/[\x{1F5D1}-\x{1F5D3}]/u',
                  '/[\x{1F5DC}-\x{1F5DE}]/u',
                  '/[\x{1F5E1}]/u',
                  '/[\x{1F5E3}]/u',
                  '/[\x{1F5E8}]/u',
                  '/[\x{1F5EF}]/u',
                  '/[\x{1F5F3}]/u',
                  '/[\x{1F5FA}-\x{1F64F}]/u',
                  '/[\x{1F680}-\x{1F6C5}]/u',
                  '/[\x{1F6CB}-\x{1F6D2}]/u',
                  '/[\x{1F6E0}-\x{1F6E5}]/u',
                  '/[\x{1F6E9}]/u',
                  '/[\x{1F6EB}-\x{1F6EC}]/u',
                  '/[\x{1F6F0}]/u',
                  '/[\x{1F6F3}-\x{1F6F9}]/u',
                  '/[\x{1F910}-\x{1F93A}]/u',
                  '/[\x{1F93C}-\x{1F93E}]/u',
                  '/[\x{1F940}-\x{1F945}]/u',
                  '/[\x{1F947}-\x{1F970}]/u',
                  '/[\x{1F973}-\x{1F976}]/u',
                  '/[\x{1F97A}]/u',
                  '/[\x{1F97C}-\x{1F9A2}]/u',
                  '/[\x{1F9B0}-\x{1F9B9}]/u',
                  '/[\x{1F9C0}-\x{1F9C2}]/u',
                  '/[\x{1F9D0}-\x{1F9FF}]/u',
                  '/[\x{E0062}-\x{E0063}]/u',
                  '/[\x{E006C}]/u',
                  '/[\x{E006E}]/u',
                  '/[\x{E007F}]/u'
              ];
          
              return preg_replace($regexEmoticons, '', $text);
          }
          

          这里是生成它的代码:

          <?php
          
          $emojisAsHex = [];
          $emojisasAsDecHex = [];
          
          preg_match_all(
              "/(?:>|\s)+(U\+)(?'emojis'[0-9ABCDEF]{4,5})(?:<|\s)+/",
              file_get_contents('http://unicode.org/emoji/charts/full-emoji-list.html'),
              $emojisAsHex
          );
          
          //flip it, to remove duplication
          $emojisAsHex = array_flip(array_flip($emojisAsHex['emojis']));
          
          
          foreach ($emojisAsHex as $emojiAsHex) {
              $emojisasAsDecHex[hexdec($emojiAsHex)] = $emojiAsHex;
          }
          
          ksort($emojisasAsDecHex);
          
          
          
          
          $outputHexa = '';
          $else = '';
          
          $startI = key($emojisasAsDecHex);
          $endI =max(array_keys($emojisasAsDecHex)) + 1;
          
          for ($i = $startI; $i < $endI; $i++) {
              if (isset($emojisasAsDecHex[$i]) && isset($emojisasAsDecHex[(1 + $i)])) {
          
                  $outputHexa .=  "'/[\x{" . $emojisasAsDecHex[$i] . '}';
                  while (isset($emojisasAsDecHex[(1 + $i)])) {
          
                      $i++;
                  }
          
                  $outputHexa .=  '-\x{' . $emojisasAsDecHex[$i] . "}]/u'," . PHP_EOL;
              } else if (isset($emojisasAsDecHex[$i])) {
                  $outputHexa .= "'/[\x{" . $emojisasAsDecHex[$i] . "}]/u'," . PHP_EOL;
              }
          }
          
          
          var_dump($outputHexa);
          

          【讨论】:

          • 无法正常工作,它通过示例 0x23 检测到 #。你不应该将 U+0023 U+FE0F U+20E3 分成 2 个 unicodes
          【解决方案15】:

          你也可以使用这个regex

          $text = preg_replace('([*#0-9](?>\\xEF\\xB8\\x8F)?\\xE2\\x83\\xA3|\\xC2[\\xA9\\xAE]|\\xE2..(\\xF0\\x9F\\x8F[\\xBB-\\xBF])?(?>\\xEF\\xB8\\x8F)?|\\xE3(?>\\x80[\\xB0\\xBD]|\\x8A[\\x97\\x99])(?>\\xEF\\xB8\\x8F)?|\\xF0\\x9F(?>[\\x80-\\x86].(?>\\xEF\\xB8\\x8F)?|\\x87.\\xF0\\x9F\\x87.|..(\\xF0\\x9F\\x8F[\\xBB-\\xBF])?|(((?<zwj>\\xE2\\x80\\x8D)\\xE2\\x9D\\xA4\\xEF\\xB8\\x8F\k<zwj>\\xF0\\x9F..(\k<zwj>\\xF0\\x9F\\x91.)?|(\\xE2\\x80\\x8D\\xF0\\x9F\\x91.){2,3}))?))',' ',$text);
          

          找了很多遍,找到了,希望有用。

          【讨论】:

            【解决方案16】:

            你可以使用str_replace()

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

            【讨论】:

            • 由于显而易见的原因没有帮助
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-04-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多