【问题标题】:Extracting all the emojis from a string using REGEX使用正则表达式从字符串中提取所有表情符号
【发布时间】:2018-02-09 05:16:13
【问题描述】:

我一直在尝试使用下面列出的正则表达式函数从字符串中提取所有表情符号。但是,此功能有时并不准确,因为它会在此过程中添加额外的表情符号。 我正在使用的正则表达式是这个:

preg_match_all('/([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', $string, $emojis);

当我尝试在此之后打印“emojis[0]”时,有时它并不准确。

例如,

代码:

$string = "Get into it !!! ????????????";
preg_match_all('/([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', $string, $emojis);
print_r($emojis[0]);

输出:

数组([0] => ?????? [1] => ???? [2] => ????)

这不是预期的,因为上述数组中的第二个元素不在输入的字符串中。

这是一个正则表达式问题吗?有没有更好的正则表达式?或者除了 REGEX 以外的任何东西来提取表情符号?

【问题讨论】:

    标签: php regex preg-replace preg-match preg-match-all


    【解决方案1】:

    您正在处理“Fitzpatrick 修饰符”。

    我没有仔细查看您的正则表达式模式以进行改进,但我可以提供一个快速的解决方案。

    在你的模式开头使用:(?:[\x{1f3fb}-\x{1f3ff}](*SKIP)(*FAIL))| 取消修饰符的资格。

    代码:(Demo)

    $string = "Pregnant Woman: ?? Pregnant Woman: ? Fork and Knife: ? Light Skin Tone: ? (a pale skin tone modifier)";
    //$string = "Get into it !!! ???";
        preg_match_all('/(?:[\x{1f3fb}-\x{1f3ff}](*SKIP)(*FAIL))|[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', $string, $emojis);
    print_r($emojis[0]);
    

    输出:

    Array
    (
        [0] => ?
        [1] => ?
        [2] => ?
    )
    

    【讨论】:

    • 在 ?‍♂️ 上失败—识别两个表情符号:?和♂️
    • 可以缓解吗?我不经常玩这个范围的“文本”。我不知道为什么我的角色类中有一个管道,我通常不会犯这个错误。那时一定没喝过咖啡。
    • 我很难在 regex101 上测试/开发,因为当我将 ?‍♂️ 粘贴到输入框中时,会发生拆分。
    • @BobbyJack 快速浏览了序列的一些文档后,我认为问题是由于 Fitzpatrick 修饰符不在序列的开头? emojipedia.org/man-facepalming-type-1-2 如果您自己正在与这个问题作斗争,也许可以重新排列模式的顺序。我还建议从字符类中省略所有管道并应用 x 模式修饰符,以便模式可以分布在多行代码中(提高可读性)。
    • 我在火车上真的没有足够的时间好好看看。
    猜你喜欢
    • 2014-09-10
    • 2015-12-27
    • 2018-01-28
    • 2014-10-17
    • 2014-08-25
    • 2010-10-14
    • 1970-01-01
    相关资源
    最近更新 更多