👻
【PHP】PCRE で連続した絵文字を正しく扱えない事例
偶然、連続した絵文字を PCRE 関数で正しく扱えない問題に遭遇。3、4番目の絵文字が1つに扱われてしまう。PHP のバージョンは 8.2.8。
// https://kazuhira-r.hatenablog.com/entry/2022/09/28/020028
$str = '👆🏼🇦🇿🏴👨👩👧👦';
var_dump(
preg_match_all('/\X/su', $str, $matches),
$matches
);
Oniguruma (mbstring) は正しく処理する。
$str = '👆🏼🇦🇿🏴👨👩👧👦';
$length = 0;
mb_ereg_search_init($str, '\X');
while (mb_ereg_search()) {
$regs = mb_ereg_search_getregs();
echo $regs[0], PHP_EOL;
++$length;
}
echo $length, PHP_EOL;
Ruby (Onigumo) も正しく処理する。
str = "👆🏼🇦🇿🏴👨👩👧👦"
a = str.grapheme_clusters
puts a
puts a.size
Discussion