これらのアプローチはすべて有効ですが、基本的には正規表現に対する文字のブロックリストです。これは保守が難しく、エラーが発生しやすくなります。
絵文字は実際には、ウェブやその他の場所でアイコンとして広く使用されているさまざまなコード ブロックの 1 つです。それらはすべて補助多言語面に属します。
Unicode には、おそらくバージョン間で変更されないコード ポイント (つまり、シンボル エンコーディング) を割り当てるための明確な構造があり、それをうまく活用できます。
- 1F000 と 1F0FF の間で、ゲームのシンボルを見つけるだけです。
- 1F300 と 1FBFF の間には、囲まれているかどうかに関係なく、アルファベットまたは言語の文字記号を見つけることは決してありません。
- E0000 と E007D の間に謎のタグコード ブロックがあります。1F3F4 (これは : ) と E007F によってカプセル化されると、フラグをレンダリングし、文字を変更するように機能します。黒旗を除外する場合は、これも除外してください。
したがって、マルチバイト文字列に対して安全ではないハックな preg_replaces 実装に依存する代わりに(それがmb_ereg_replaceがある理由です)、Intl モジュールを使用します。
/**
* Removes all characters within a Unicode codepoint range, *extremes included*, from a given UTF-8 string
* @param string $text The text to filter
* @param int $rangeStart The beginning of the Unicode range
* @param int $rangeEnd The end of the Unicode range
* @return string The filtered string
*/
function SanifyUnicodeRange(string $input, int $rangeStart, int $rangeEnd) {
/*
If you have php >= 7.4, use mb_str_split in place of the following 7 lines
If you are using another UTF encoding and you're not using mb_str_split,
remember to change it below
*/
$inputLength = mb_strlen($input);
$charactersArray = array();
while ($inputLength) {
$charactersArray[] = mb_substr($input, 0, 1, "UTF-8");
$input = mb_substr($input, 1, $inputLength, "UTF-8");
$inputLength = mb_strlen($input);
}
//Iterate over the characters array, and implode (which is mb-safe) it back into a string
return implode('', array_filter($charactersArray, function ($unicodeCharacter) use ($rangeStart, $rangeEnd) {
$codePoint = IntlChar::ord($unicodeCharacter);
//Does it fall within the code block we're filtering?
return ($codePoint < $rangeStart || $codePoint > $rangeEnd);
}));
}