Php 检测字符串中的表情符号

Php 检测字符串中的表情符号,php,mysql,laravel,detection,emoticons,Php,Mysql,Laravel,Detection,Emoticons,我发现您需要PHP7和MySQL 5.5来使用要上传到数据库的字符串中的表情符号。 我的服务器上没有这些规范,所以我想用laravel或php给出一条错误消息 有没有办法检测php中的表情符号?如果是这样,那么我可以创建一个自定义验证或类似的东西 我已经尝试过在Laravel中验证alpha_dash,但是不可能像这样做一个老式的方法:-)这是无耻地从这个函数复制和调整的。因此,感谢编写了原始函数的人 function has_emojis_old( $string ) { preg_

我发现您需要PHP7和MySQL 5.5来使用要上传到数据库的字符串中的表情符号。 我的服务器上没有这些规范,所以我想用laravel或php给出一条错误消息

有没有办法检测php中的表情符号?如果是这样,那么我可以创建一个自定义验证或类似的东西


我已经尝试过在Laravel中验证alpha_dash,但是不可能像这样做一个老式的方法
:-)

这是无耻地从这个函数复制和调整的。因此,感谢编写了原始函数的人

function has_emojis_old( $string ) {

    preg_match( '/[\x{1F600}-\x{1F64F}]/u', $string, $matches_emo );

    return !empty( $matches_emo[0] ) ? true : false;

}
编辑:

正如所指出的,上面的函数无法检测到一些表情符号。我已经检查过了,这是绝对正确的

原因是上面的函数检查unicode范围(类似于:此字符是否介于5和15之间)。但是有很多表情符号不在这个范围内。有可能只是增加unicode范围,但该范围内可能有一些字符不是表情符号……所以这看起来不是很优雅

原始函数检查多个范围,这可能是最佳解决方案。事实是,这个函数是4年前更新的,所以它肯定不能反映当前的表情调色板

因为我对表情符号及其unicode范围不太了解,所以我无法提供基于范围的解决方案……相反,我只是对照以下内容进行检查:


当然,该功能会在每一个新的表情符号版本中更新,但对于范围解决方案也是如此。

这是无耻地从该功能复制和调整的。因此,感谢编写了原始函数的人

function has_emojis_old( $string ) {

    preg_match( '/[\x{1F600}-\x{1F64F}]/u', $string, $matches_emo );

    return !empty( $matches_emo[0] ) ? true : false;

}
编辑:

正如所指出的,上面的函数无法检测到一些表情符号。我已经检查过了,这是绝对正确的

原因是上面的函数检查unicode范围(类似于:此字符是否介于5和15之间)。但是有很多表情符号不在这个范围内。有可能只是增加unicode范围,但该范围内可能有一些字符不是表情符号……所以这看起来不是很优雅

原始函数检查多个范围,这可能是最佳解决方案。事实是,这个函数是4年前更新的,所以它肯定不能反映当前的表情调色板

因为我对表情符号及其unicode范围不太了解,所以我无法提供基于范围的解决方案……相反,我只是对照以下内容进行检查:


当然,此功能在每次新的表情符号发布时都会更新,但在范围解决方案中也必须更新此功能。

使用以下功能:

function remove_emoji($string) {

    // Match Emoticons
    $regex_emoticons = '/[\x{1F600}-\x{1F64F}]/u';
    $clear_string = preg_replace($regex_emoticons, '', $string);

    // Match Miscellaneous Symbols and Pictographs
    $regex_symbols = '/[\x{1F300}-\x{1F5FF}]/u';
    $clear_string = preg_replace($regex_symbols, '', $clear_string);

    // Match Transport And Map Symbols
    $regex_transport = '/[\x{1F680}-\x{1F6FF}]/u';
    $clear_string = preg_replace($regex_transport, '', $clear_string);

    // Match Miscellaneous Symbols
    $regex_misc = '/[\x{2600}-\x{26FF}]/u';
    $clear_string = preg_replace($regex_misc, '', $clear_string);

    // Match Dingbats
    $regex_dingbats = '/[\x{2700}-\x{27BF}]/u';
    $clear_string = preg_replace($regex_dingbats, '', $clear_string);

    return $clear_string;
}

使用以下功能:

function remove_emoji($string) {

    // Match Emoticons
    $regex_emoticons = '/[\x{1F600}-\x{1F64F}]/u';
    $clear_string = preg_replace($regex_emoticons, '', $string);

    // Match Miscellaneous Symbols and Pictographs
    $regex_symbols = '/[\x{1F300}-\x{1F5FF}]/u';
    $clear_string = preg_replace($regex_symbols, '', $clear_string);

    // Match Transport And Map Symbols
    $regex_transport = '/[\x{1F680}-\x{1F6FF}]/u';
    $clear_string = preg_replace($regex_transport, '', $clear_string);

    // Match Miscellaneous Symbols
    $regex_misc = '/[\x{2600}-\x{26FF}]/u';
    $clear_string = preg_replace($regex_misc, '', $clear_string);

    // Match Dingbats
    $regex_dingbats = '/[\x{2700}-\x{27BF}]/u';
    $clear_string = preg_replace($regex_dingbats, '', $clear_string);

    return $clear_string;
}

根据约翰尼斯的回答,我在某个论坛上找到了一个解决方案。这个正则表达式的作用是:)

[代码><代码><代码><<代码><0 0.0 0-9,“([0 0.0 0 0-9,[0 0.xEF\\xB8\\X8\\X8.8\\X8.3\X8.0.0 0.0.0.0.0.0.0.0.0.0-X8.0.X8\X8.0\X8\\X8.8.8.10 10 10 10 10 10 10 10.3.3,,,,<0 0.2,,<0.0.0 0.0 0.0.0.0 0.0 0.0.0.0.0.0.0 0 0.0.0,,,,<0 0 0 0 0 0 0 0.0 0 0.0.0 0.0,,,,<0.0.0 0 0 0 0 0 0.0.0 0.0.0.0,,,,,,,,<0 0.0 0 0 0.0,,,\\x9F\\x87.|..(\\xF0\\x9F\\x8F[\\xBB-\\xBF])?|((?\\xE2\\x80\\x8D)\\xE2\\x9D\\xA4\\xEF\\xB8\\x8F\k\\xF0\\x9F.(\k\\xF0\\x9F\\x91.)?|(\\xE2\\x80\\x8D\\xF0\\x9F\\x91.{2,3}))?);
根据约翰的回答,我在某个论坛上找到了一个解决方案。这个正则表达式的作用是:)

[代码><代码><代码><<代码><0 0.0 0-9,“([0 0.0 0 0-9,[0 0.xEF\\xB8\\X8\\X8.8\\X8.3\X8.0.0 0.0.0.0.0.0.0.0.0.0-X8.0.X8\X8.0\X8\\X8.8.8.10 10 10 10 10 10 10 10.3.3,,,,<0 0.2,,<0.0.0 0.0 0.0.0.0 0.0 0.0.0.0.0.0.0 0 0.0.0,,,,<0 0 0 0 0 0 0 0.0 0 0.0.0 0.0,,,,<0.0.0 0 0 0 0 0 0.0.0 0.0.0.0,,,,,,,,<0 0.0 0 0 0.0,,,\\x9F\\x87.|..(\\xF0\\x9F\\x8F[\\xBB-\\xBF])?|((?\\xE2\\x80\\x8D)\\xE2\\x9D\\xA4\\xEF\\xB8\\x8F\k\\xF0\\x9F.(\k\\xF0\\x9F\\x91.)?|(\\xE2\\x80\\x8D\\xF0\\x9F\\x91.{2,3}))?);
检测表情符号的最佳方法是使用Unicode正则表达式选项中的Symbol属性

preg_match('/\p{S}/u', $string, $output);

检测表情符号的最佳方法是使用Unicode正则表达式选项中的Symbol属性

preg_match('/\p{S}/u', $string, $output);


可能重复的我不想删除它们,但检测到它们问题的答案包含一个正则表达式作为响应,因此您可以轻松地将其用于您的案例…可能重复的我不想删除它们,但检测到它们问题的答案包含一个正则表达式作为响应,因此,您可以轻松地将其用于您的案例中…只使用代码的答案是非常不鼓励的。为了帮助未来的读者,请解释一下你正在做什么!这似乎没有抓住标志,只有代码的答案是真正不鼓励。为了帮助未来的读者,请解释一下你正在做什么!这似乎不太受欢迎,谢谢!这没有检测到一些表情符号的心(❤️), Sun(虽然这是unicode表情符号表中的确切字符,但似乎在数字和/或其他字符方面存在问题…对所有现有表情符号有任何建议或可行的解决方案都很好。还没有找到一个好的解决方案,所以它可以很好地工作。但它也可以删除数字(例如12345)。我应该如何更新preg_匹配以允许数字保留在字符串中?谢谢!这不会检测到某些表情符号的心(❤️), Sun(虽然这是unicode表情符号表中的确切字符,但似乎在数字和/或其他字符方面存在问题…对所有现有表情符号有任何建议或可行的解决方案都很好。还没有找到一个好的解决方案,所以它可以很好地工作。但它也可以删除数字(例如12345)。我应该如何更新preg_匹配以允许数字保留在字符串中?什么是?>扩展名。它会导致错误:|什么是?>扩展名。它会导致错误:|欢迎,感谢您提供的洞察和文档链接。我是否可以建议
编辑
以避免使用绝对确定的方式,如“最佳方式”在你的回答中,很少有一种确定的“最佳”方式是针对每种情况的故障安全。我个人认为这可能是这两种情况的标志