首页 > 解决方案 > Unicode 正则表达式:编译失败:字符类中的范围无序

问题描述

我将来自https://twemoji.maxcdn.com/v/latest/twemoji.js的正则表达式转换为匹配与表情符号相关的 Unicode 字符从 javascript 到 php。

当我使用 regex101.com 对其进行测试时,转换后的正则表达式按预期工作

但是,当我在本地环境中进行测试时,它不起作用。

你可以在这里看到一个工作示例https://regex101.com/r/IuIhBF/1

这是PHP版本。http://sandbox.onlinephpfunctions.com/code/3bd5933f5230fc1c45104b7eccd9379b68870016

我尝试更改 preg_match_all 标志。将 u 添加到正则表达式 ex: /*****/u

无法让它工作

如果有人可以帮助我解决该错误,那就太好了:编译失败:偏移量 306 处的字符类范围乱序。

标签: javascriptphpregex

解决方案


此表达式似乎正在处理您的样本,带有一个u标志:

$re = '/[\x{1f300}-\x{1f5ff}\x{1f900}-\x{1f9ff}\x{1f600}-\x{1f64f}\x{1f680}-\x{1f6ff}\x{2600}-\x{26ff}\x{2700}-\x{27bf}\x{1f1e6}-\x{1f1ff}\x{1f191}-\x{1f251}\x{1f004}\x{1f0cf}\x{1f170}-\x{1f171}\x{1f17e}-\x{1f17f}\x{1f18e}\x{3030}\x{2b50}\x{2b55}\x{2934}-\x{2935}\x{2b05}-\x{2b07}\x{2b1b}-\x{2b1c}\x{3297}\x{3299}\x{303d}\x{00a9}\x{00ae}\x{2122}\x{23f3}\x{24c2}\x{23e9}-\x{23ef}\x{25b6}\x{23f8}-\x{23fa}]/u';
$str = 'Time in emoji is very expressive.  allowed us to communicate time very easily.

Next up was negation. ❌️ means “No talk.”';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

var_dump($matches);

该表达式在regex101.com的右上角面板上进行了说明,如果您希望探索/简化/修改它,并且在此链接中,您可以查看它如何与一些示例输入匹配,如果您愿意的话。

参考

如何在忽略表情符号的同时匹配非字母数字的正则表达式特殊字符?


推荐阅读