php找到表情符号[更新现有代码]

Kuk*_*osk 5 php regex unicode emoji

我正在尝试在我的PHP代码中检测表情符号,并阻止用户输入它.

我的代码是:

if(preg_match('/\xEE[\x80-\xBF][\x80-\xBF]|\xEF[\x81-\x83][\x80-\xBF]/', $value) > 0)
{
    //warning...
}
Run Code Online (Sandbox Code Playgroud)

但不适用于所有表情符号.有任何想法吗?

bob*_*nce 10

if(preg_match('/\xEE[\x80-\xBF][\x80-\xBF]|\xEF[\x81-\x83][\x80-\xBF]/', $value) 
Run Code Online (Sandbox Code Playgroud)

您确实希望在字符级别匹配Unicode,而不是尝试跟踪UTF-8字节序列.使用u修饰符可以基于字符处理UTF-8字符串.

表情符号在块U + 1F300-U + 1F5FF中编码.然而:

  • 日本运营商''表情符号'集合中的许多字符实际上映射到现有的Unicode符号,例如卡套装,十二生肖和一些箭头.你现在把这些符号算作'表情符号'吗?

  • 仍有系统不使用新标准化的Unicode表情符号代码点,而是使用专用区域中的ad-hoc范围.每个运营商都有自己的编码.iOS 4使用了Softbank集.更多信息.您可能希望阻止整个私人使用区域.

例如:

function unichr($i) {
    return iconv('UCS-4LE', 'UTF-8', pack('V', $i));
}

if (preg_match('/['.
    unichr(0x1F300).'-'.unichr(0x1F5FF).
    unichr(0xE000).'-'.unichr(0xF8FF).
']/u'), $value) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • 那就是你算作表情符号的问题.❤在任何人想到表情符号之前很久就存在作为一般符号.如果你想只阻止已经重复用于表情符号的符号,请查看上面的Emoji For PHP链接,并选出所有使用的U + 2xxx代码点.或者,如果您不需要它们,可以考虑阻止更广泛的符号,例如`unichr(0x2190).'-'.unichr(0x27FF)`. (2认同)