👻

【PHP】PCRE で連続した絵文字を正しく扱えない事例

2023/07/07に公開

偶然、連続した絵文字を 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