从电子邮件正文中删除表情符号时,正则表达式不匹配unicode

时间:2015-07-03 15:03:25

标签: php regex unicode

更新

使用:regex101之后,我发现它只对1个结果进行匹配,当将修饰符更改为\ g时,它就吓坏了! :( - 样本测试:https://regex101.com/r/yD9hI4/1

更新2

在上面的示例中添加ug修饰符时,它(有点)有效!但PHP引发了Unknown modifier g的异常:(无法获胜!讨​​厌正则表达式......

更新3

此后已在preg_replace上阅读并且它不理解\g,因为它在默认限制(默认情况下)时默认匹配所有内容。所以现在我真的不明白为什么preg_replace只找到一个匹配并忽略其余的匹配。

原始问题 我正在尝试删除表情符号/ Unicode图片字符的所有引用,但我的正则表达式与gmail不匹配。我已经下载了以下电子邮件,以便处理:

Test

*Test*


*[image: Inline images 1]*

*Test?*

Test?

=F0=9F=98=88

TEST!

我正试图摆脱=F0=9F=98=88。在这个例子中,它是带角的笑脸(google风味)。其中由unicode值表示:U+1F608(hex / utf-8:f0 9f 98 88) - 现在,这是唯一不会消失的bugger,其他所有内容都由我的正则表达式覆盖:< / p>

/[\x{1F600}-\x{1F64F}]/u(表情符号)和/[\x{1F680}-\x{1F6FF}]/u(传输等)

现在在任何人指出明显的并且说:“= F0 = 9f = 98 = 88不是你正在寻找的”,我同意,但我想知道为什么,当我和其他人一起测试时表情符号,只有魔鬼魔鬼才能解析?

任何人(具有比我更大的正则表达式知识)都能解释出现了什么问题吗?

请求的代码

private function removePictureCharacters($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;
}

1 个答案:

答案 0 :(得分:2)

我有一个非常脆弱的黑客,但它确实完成了工作:

private function removePictureCharacters($text) {
    $clean_text = "";

    // Never trust a horned smiler
    $smiley = json_decode('"\u1F608"');
    $clean_text = preg_replace("/$smiley/u", '', $text);

    // Match Emoticons
    $regexEmoticons = '/([\x{1F600}-\x{1F64F}])/u';
    ...
}