まず基本的な絵文字除去を行います。
php
1$str = "????♀️";
2echo $str; // "????♀️"
3$repArr = array(
4 "/\xd83c[\xdf00-\xdfff]/",
5 "/\xd83d[\xdc00-\xde4f]/",
6 "/\xd83d[\xde80-\xdeff]/",
7 "/\xd7c9[\xde00-\xdeff]/",
8 "/[\x2600-\x27BF]/",
9 "/[\x203C|\x2047-\x2049|\x2753-\x2757|\x2761-\x2767][\xFE0E-\xFE0F]/",
10 "/[0-9|*|#][\xFE0E-\xFE0F]\x20E3/",
11 "/[0-9|*|#]\x20E3/",
12 "/[\x23E9-\x23FA]/",
13 "/[\x23CF|\x25B6|\x25C0|\x2B05-\x2B07|\x2194-\x21AA|\x2934-\x2935|\x2122|©|®|\x3030|\x25FC-\x25FE][\xFE0E-\xFE0F]/",
14 "/\xA4B3/"
15);
16$str = preg_replace($repArr, '', $str);
さらに、サロゲートペアの残りカスと、4バイト文字を除去します。
php
1// 新たな文字列を用意
2$retStr = '';
3// 文字列を配列にしたものを用意
4$strArr = str_split($str);
5// 1文字1文字ずつ処理
6foreach ($strArr as $strS) {
7 if (strlen($strS) < 4 && htmlspecialchars_decode("︎", ENT_QUOTES) != $strS && htmlspecialchars_decode("️", ENT_QUOTES) != $strS) {
8 $retStr .= $strS;
9 }
10}
11
12$str = $retStr;
13
14echo $str;
これで、ある程度のよく使われる絵文字は除去されるかと。
(ただし、phpのエラー出力を厳密にしていると、17行目で警告が出る → 正規表現の定義数が多すぎるため)
しかし、これでも、全ての絵文字の除去はできていません。
さらに、4バイト文字を除去すると異体字も除去されます。
そして、4バイト文字として絵文字を除去としないと、
上記の基本除去の部分で文字コードをひたすら追加で定義しなくてはいけなくなります。
ただ、正規表現の部分は、もっと効率のいい書き方が存在するかとは思います。
しかし、絵文字の文字コードは、傾向性が全く統一されておらず、ピンポイントで指定するしかないのが、現状です。
それくらい、絵文字除去は厄介な代物です。