我使用这个正则表达式从字符串中删除所有可能的表情符号。
/(\x{00a9}|\x{00ae}|[\x{2000}-\x{3300}]|\x{d83c}[\x{d000}-\x{dfff}]|\x{d83d}[\x{d000}-\x{dfff}]|\x{d83e}[\x{d000}-\x{dfff}])/u
但它会抛出以下异常:
preg_replace()函数:编译失败:偏移量46处不允许的Unicode码位(〉= 0xd800 &&〈= 0xdfff)
我在谷歌上搜索了这个问题,但是我找不到任何关于这个问题的准确答案。如果有人告诉我这个错误到底是什么意思,以及解决办法是什么,我将不胜感激。
还这是什么:
>= 0xd800 && <= 0xdfff
以上正则表达式是此源的PCRE版本:
https://www.regextester.com/106421
3条答案
按热度按时间bvuwiixz1#
Emojis在UAX#51中指定。属性
\p{Emoji}
应该起作用,但没有。用强硬的方式来做。解析
emoji-*.txt
:这给了我们一个以换行符分隔的所有表情符号列表。
laximzn52#
下面是PHP中的等效版本:
为了创建它,我已经将代理范围转换为int,这要归功于:How to convert between a Unicode/UCS codepoint and a UTF16 surrogate pair?
然后我把范围
6tqwzwtp3#
就PHP而言,您可以对尝试应用“非法”REGEX模式的字符串进行json_encode(),这将把字符串转换为UTF-8友好字符。
在这里,您可以检查文字Unicode字符串:
注意:我把它 Package 在一个json_decode()中,以取回原始字符串。
另外,
>= 0xd800 && <= 0xdfff
只是说任何十六进制范围内的unicode都会抛出这个错误。我在上面的例子中使用的emoji确实在非法范围内。**缺点:**您无法使用此解决方案应用十六进制范围,您必须准确了解哪些表情符号有问题,并精确处理它们(例如
'/' . implode('|', EmojiClass::BAD_EMOJI_HEXES_ARRAY) . '/i'
)