37

Instagramのコメントから絵文字を削除する簡単な機能を探しています。私が今試したこと(SOおよび他のWebサイトで見つけた例からの多くのコードを使用):

// PHP class
public static function removeEmoji($string)
{
    // split the string into UTF8 char array
    // for loop inside char array
        // if char is emoji, remove it
    // endfor
    // return newstring
}

どんな助けでもいただければ幸いです

4

16 に答える 16

74

preg_replace 関数が最も簡単な解決策だと思います。

EaterOfCodeが示唆するように、私はwiki ページを読み、新しい正規表現をコーディングしました。これは、SO (または他の Web サイト) の回答が Instagram の写真のキャプション (API を返す形式) に対して機能しないように思われたためです。注: \x Unicode 文字に一致するには、/u 識別子が必須です。

public static function removeEmoji($text) {

    $clean_text = "";

    // Match Emoticons
    $regexEmoticons = '/[\x{1F600}-\x{1F64F}]/u';
    $clean_text = preg_replace($regexEmoticons, '', $text);

    // Match Miscellaneous Symbols and Pictographs
    $regexSymbols = '/[\x{1F300}-\x{1F5FF}]/u';
    $clean_text = preg_replace($regexSymbols, '', $clean_text);

    // Match Transport And Map Symbols
    $regexTransport = '/[\x{1F680}-\x{1F6FF}]/u';
    $clean_text = preg_replace($regexTransport, '', $clean_text);

    // Match Miscellaneous Symbols
    $regexMisc = '/[\x{2600}-\x{26FF}]/u';
    $clean_text = preg_replace($regexMisc, '', $clean_text);

    // Match Dingbats
    $regexDingbats = '/[\x{2700}-\x{27BF}]/u';
    $clean_text = preg_replace($regexDingbats, '', $clean_text);

    return $clean_text;
}

絵文字は他にもたくさんあるので、この関数はすべての絵文字を削除するわけではありませんが、要点はわかります。

unicode.orgを参照してください- 完全な絵文字リスト(thanks Epoc )

于 2012-10-10T16:29:41.287 に答える
5

これらのアプローチはすべて有効ですが、基本的には正規表現に対する文字のブロックリストです。これは保守が難しく、エラーが発生しやすくなります。

絵文字実際には、ウェブその他の場所でアイコンとして広く使用されているさまざまなコード ブロックの 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);
     }));
 }
于 2020-07-03T07:32:13.980 に答える
0
function emojiFilter($text){
$text = json_encode($text);
preg_match_all("/(\\\\ud83c\\\\u[0-9a-f]{4})|(\\\\ud83d\\\u[0-9a-f]{4})|(\\\\u[0-9a-f]{4})/", $text, $matchs);
if(!isset($matchs[0][0])) { return json_decode($text, true); }

$emoji = $matchs[0];
foreach($emoji as $ec) {
    $hex = substr($ec, -4);
    if(strlen($ec)==6) {
        if($hex>='2600' and $hex<='27ff') {
            $text = str_replace($ec, '', $text);
        }
    } else {
        if($hex>='dc00' and $hex<='dfff') {
            $text = str_replace($ec, '', $text);
        }
    }
}

return json_decode($text, true);  }
于 2014-10-30T08:23:55.430 に答える
0

絵文字文字は Unicode の私用領域を使用するため、 を使用preg_replace()して、エンコードされた文字の領域全体を から に削除U+E000できますU+F8FF

function removeEmoji($string) {
    return preg_replace('/&#x(e[0-9a-f][0-9a-f][0-9a-f]|f[0-8][0-9a-f][0-9a-f])/i', '', $string);
}
于 2012-10-09T20:16:50.623 に答える
-4

あなたはただ使うことができますstr_replace()

$emojiArray = array("&0123","&0234",etc. for all emoji);
$strippedComment = str_replace($emojiArray,"",$originalComment);
于 2012-10-09T19:42:42.020 に答える