【发布时间】:2019-01-27 13:28:55
【问题描述】:
anubhava's answer about matching ranges of unicode characters 引导我使用正则表达式来清理特定范围的单个字符代码点。有了它,现在我可以用这个简单的表达式匹配所有miscellaneous symbols in this list(包括表情符号):
preg_replace('/[\x{2600}-\x{26FF}]/u', '', $str);
但是,我也想匹配这个list of paired/double surrogates emoji中的那些,但是作为nhahtdh explained in a comment:
在
d800到dfff的范围内可以指定UTF-16 中的代理项以允许指定更多字符。 单个代理不是 UTF-16 中的有效字符(需要一对来指定有效字符)。
所以,例如,当我尝试这个时:
preg_replace('/\x{D83D}\x{DE00}/u', '', $str);
仅替换paired surrogates on this list 中的第一个,即:????
PHP 抛出这个:
preg_replace():编译失败:不允许的 Unicode 代码点(>= 0xd800 && <= 0xdfff)
我尝试了几种不同的组合,包括UTF8 for ???? ('/[\x{00F0}\x{009F}\x{0098}\x{0080}]/u') 中上述代码点的假定组合,但我仍然无法匹配它。我还查看了其他PCRE pattern modifiers,但似乎u 是唯一允许指向UTF8 的。
我在这里错过了任何“逃避”的选择吗?
【问题讨论】:
-
您是否只是想构建一个正则表达式来匹配这 80 个表情符号并将其用作“硬编码”模式,或者您是否正在尝试编写将“转换”
U+1F600到\x{D83D}\x{DE00}的代码? -
哪个 PHP 版本?
-
@WiktorStribiżew 如果可能的话。 hardcoded 模式将是一个范围。
-
@revo PHP 7.1.5 及以上版本。
-
如果您的 PHP 未附带针对 UTF-16 的 PCRE 构建,那么您将无法执行此类匹配。从 PHP 7.0 开始,您可以使用 Unicode 代码点,遵循此语法
\u{XXXX},例如preg_replace("~\u{1F600}~", '', $str);(注意双引号)
标签: php regex unicode preg-replace unicode-escapes