🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

12858閲覧

PHPで絵文字を削除する良い方法を教えてください

qwe001

総合スコア133

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/12/03 05:36

ネットで上のようなことを調べると、次のような記述が良く出てきます。

preg_replace("/[\xF0-\xF7][\x80-\xBF][\x80-\xBF][\x80-\xBF]/", "", $str);

これは、4Byteの絵文字は削除できますが、十分ではないように見えます。

例えば、次のような3Byteの絵文字は削除できません。

<?php $str = "☔️"; echo $str; // "☔️" $str = preg_replace("/[\xF0-\xF7][\x80-\xBF][\x80-\xBF][\x80-\xBF]/", "", $str); echo $str; // "☔️" ?>

また、4Byteの絵文字でも走る人の絵文字のように、性別表現を持つ絵文字は性別記号が残ってしまいます。

<?php $str = "????‍♀️"; echo $str; // "????‍♀️" $str = preg_replace("/[\xF0-\xF7][\x80-\xBF][\x80-\xBF][\x80-\xBF]/", "", $str); echo $str; // "♀" ?>

絵文字は消しつつも、よく使う記号(?や!など)は残すような記述はできるのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2019/12/03 05:41

残すべき「よく使う記号」の範囲を厳密に決めてください。
qwe001

2019/12/03 06:01

「?と!」だけでいいです
hentaiman

2019/12/03 06:31

日本語の場合だと全角半角ありますよ、読点句読点もありますよ、それらも踏まえて厳密に決めないと
qwe001

2019/12/03 06:57

半角だけでいいです
miyabi_takatsuk

2019/12/03 07:21

絵文字除去は泥沼なので・・・、 (思ってもみないものが数百~数千種類存在する。しかも、文字コード傾向もまるでバラバラ) maisumakunさんとhentaimanさんのおっしゃる通り、厳密に決めないと、必要な文字まで除去してしまいかねません。
guest

回答2

0

ベストアンサー

まず基本的な絵文字除去を行います。

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("&#65038", ENT_QUOTES) != $strS && htmlspecialchars_decode("&#65039", ENT_QUOTES) != $strS) { 8 $retStr .= $strS; 9 } 10} 11 12$str = $retStr; 13 14echo $str;

これで、ある程度のよく使われる絵文字は除去されるかと。
(ただし、phpのエラー出力を厳密にしていると、17行目で警告が出る → 正規表現の定義数が多すぎるため)
しかし、これでも、全ての絵文字の除去はできていません
さらに、4バイト文字を除去すると異体字も除去されます。
そして、4バイト文字として絵文字を除去としないと、
上記の基本除去の部分で文字コードをひたすら追加で定義しなくてはいけなくなります。

ただ、正規表現の部分は、もっと効率のいい書き方が存在するかとは思います。

しかし、絵文字の文字コードは、傾向性が全く統一されておらず、ピンポイントで指定するしかないのが、現状です。
それくらい、絵文字除去は厄介な代物です。

投稿2019/12/03 08:41

編集2019/12/03 08:43
miyabi_takatsuk

総合スコア9555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

qwe001

2019/12/04 01:16

miyabi_takatsuk様 ご回答ありがとうございます。絵文字除去が厄介そうであることがコードからよく伝わってきました。既にクローズしていましたが、こちらBAにさせて頂きます。
guest

0

私は単に絵文字の除去ができるかどうかが知りたかったのですが、どうやら難しそうだということがわかりました。皆様解答ありがとうございます。本件はクローズさせて頂きます。

投稿2019/12/03 08:28

qwe001

総合スコア133

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miyabi_takatsuk

2019/12/03 08:45

回答、タイミング遅くなってすみません。 一つ、私の回答もお試しください。 ある程度の絵文字は除去できます。
退会済みユーザー

退会済みユーザー

2019/12/03 09:09

> どうやら難しそうだということがわかりました。 どのような経緯でその結論に至ったのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問