PHP 문자열에서 utf8 이모지 삭제 하기 > PHP
PHP

PHP 문자열에서 utf8 이모지 삭제 하기

조회 3,306회 댓글 0건


이모지는 utf8에서 삭제를 해야 합니다.

euckr 문자셋에선 표현을 못하고 변환을 하면 깨져 보입니다.


우선 이모지 버전과 유니코드 버전이 같이 간다는것은 참고로 알고 계시면 되며

이모지의 범위는 아래를 보시면 됩니다.

http://unicode.org/emoji/charts/full-emoji-list.html 


● ** 중요 ** 

한글 깨지는 문제 때문에 이모지 삭제 하시려 하시는 분은 아래쪽 이모지 클래스 보면 10진수 변환 기능을 참고하여 사용하세요. 

웹 브라우저에서 euc-kr 환경에서 이모지 표현 가능 합니다.

또는 복잡하게 사용 할 것 없이 mb_convert_encoding('❤', 'HTML-ENTITIES', 'UTF-8') 이 명령으로 간단하게 처리가 가능 합니다.


1) 아래는 이모지만 삭제 하는 기능 입니다.

  /**
   * 이모지 삭제 함수
   */
  function remove_emoji( string $string ) : string
  {
    // Match Enclosed Alphanumeric Supplement
    $regex_alphanumeric = '/[\x{1F100}-\x{1F1FF}]/u';
    $clear_string = preg_replace($regex_alphanumeric, '', $string);

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

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

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

    // Match Supplemental Symbols and Pictographs
    $regex_supplemental = '/[\x{1F900}-\x{1F9FF}]/u';
    $clear_string = preg_replace($regex_supplemental, '', $clear_string);

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

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

    return $clear_string;
  }

  $str      = '이모지 ❤ 목록 ♻ ';
  $string   = remove_emoji($str);
  echo $str . ' -> ' . $string . PHP_EOL;
 


2) 이모지 클래스(삭제, 16진수 변환, 10진수변환)

10진수 변환은 브라우저에서 사용가능한 것입니다. 즉, euc-kr 환경에서 이모지 표현이 가능합니다.


class Emoji
{
  private  $symbols = "\x{1F100}-\x{1F1FF}" // Enclosed Alphanumeric Supplement
  ."\x{1F300}-\x{1F5FF}"  // Miscellaneous Symbols and Pictographs
  ."\x{1F600}-\x{1F64F}"  // Emoticons
  ."\x{1F680}-\x{1F6FF}"  // Transport And Map Symbols
  ."\x{1F900}-\x{1F9FF}"  // Supplemental Symbols and Pictographs
  ."\x{2600}-\x{26FF}"    // Miscellaneous Symbols
  ."\x{2700}-\x{27BF}";   // Dingbats

  function __construct() {
  }

  /**
   * 이모지 삭제
   */
  public function remove( string $string ) : string
  {
    return preg_replace('/['. $this->symbols . ']+/u', '', $string);
  }


  /**
   * Translates a sequence of UTF-8 bytes to their equivalent unicode code points.
   * Each code point is prefixed with "\u".
   *
   * @param string $utf8
   *
   * @return string
   */
  public function utf8_to_unicode( string $utf8 ) : string
  {
    $i    = 0;
    $l    = strlen($utf8);

    $out  = '';

    while ($i < $l) {
      if ((ord($utf8[$i]) & 0x80) === 0x00) {
        // 0xxxxxxx
        $n = ord($utf8[$i++]);
      } elseif ((ord($utf8[$i]) & 0xE0) === 0xC0) {
        // 110xxxxx 10xxxxxx
        $n =
            ((ord($utf8[$i++]) & 0x1F) <<  6) |
            ((ord($utf8[$i++]) & 0x3F) <<  0)
        ;
      } elseif ((ord($utf8[$i]) & 0xF0) === 0xE0) {
        // 1110xxxx 10xxxxxx 10xxxxxx
        $n =
            ((ord($utf8[$i++]) & 0x0F) << 12) |
            ((ord($utf8[$i++]) & 0x3F) <<  6) |
            ((ord($utf8[$i++]) & 0x3F) <<  0)
        ;
      } elseif ((ord($utf8[$i]) & 0xF8) === 0xF0) {
        // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
        $n =
            ((ord($utf8[$i++]) & 0x07) << 18) |
            ((ord($utf8[$i++]) & 0x3F) << 12) |
            ((ord($utf8[$i++]) & 0x3F) <<  6) |
            ((ord($utf8[$i++]) & 0x3F) <<  0)
        ;
      } elseif ((ord($utf8[$i]) & 0xFC) === 0xF8) {
        // 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
        $n =
            ((ord($utf8[$i++]) & 0x03) << 24) |
            ((ord($utf8[$i++]) & 0x3F) << 18) |
            ((ord($utf8[$i++]) & 0x3F) << 12) |
            ((ord($utf8[$i++]) & 0x3F) <<  6) |
            ((ord($utf8[$i++]) & 0x3F) <<  0)
        ;
      } elseif ((ord($utf8[$i]) & 0xFE) === 0xFC) {
        // 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
        $n =
            ((ord($utf8[$i++]) & 0x01) << 30) |
            ((ord($utf8[$i++]) & 0x3F) << 24) |
            ((ord($utf8[$i++]) & 0x3F) << 18) |
            ((ord($utf8[$i++]) & 0x3F) << 12) |
            ((ord($utf8[$i++]) & 0x3F) <<  6) |
            ((ord($utf8[$i++]) & 0x3F) <<  0)
        ;
      } else {
        throw new \Exception('Invalid utf-8 code point');
      }

      $n      = strtoupper(dechex($n));
      $pad    = strlen($n) <= 4 ? strlen($n) + strlen($n) %2 : 0;
      $n      = str_pad($n, $pad, "0", STR_PAD_LEFT);

      $out   .= sprintf("\u%s", $n);
    }

    return $out;
  }


  /**
   * 웹사이트에서 사용가능한 10진수
   */
  public function utf8_decimal( string $str ) : string
  {
    $aTemp      = array();
    $aMatch     = array();
    preg_match_all('/['. $this->symbols . ']+/u',$str, $aMatch);

    foreach( $aMatch[0] as $emoji ) {
      $hex      = $this->utf8_to_unicode($emoji);
      $decimal  = base_convert($hex, 16, 10);
      $decimal2 = '&#' . $decimal . ';';
      $aTemp[$emoji]  = $decimal2;
    }

    $utf8Str      = $str;
    foreach( $aTemp as $emoji => $decimal2 ) {
      $utf8Str      = mb_ereg_replace($emoji, $decimal2, $utf8Str);
    }

    return $utf8Str;
  }

  function utf8_htmlEntities( string $str) : string {
    return $this->utf8_decimal($str);
  }

  function htmlEntities( $str ) : string {
    $htmlEnt    = mb_convert_encoding($str, 'UTF-8', 'HTML-ENTITIES');
    return $htmlEnt;
  }

}

$emoji      = '이모지 하트 땀방울 번쩍';
$oEmoji     = new Emoji();
$str        = $oEmoji->remove($emoji);
$strDecimal = $oEmoji->utf8_decimal($emoji);
echo '이모지제거: ' . $emoji . ' -> ' . $str . PHP_EOL;
echo '10진수 변환: ' . $emoji . ' -> ' . $strDecimal . PHP_EOL;

 


위와 같은 방법도 있지만.

euc-kr 페이지여도 보낼 때 utf-8 보내서 받아 처리하면 문제점은 해결 될 수 있습니다.

아래는 그 예 입니다. 아래는 백엔드에서 utf-8 처리를 하는 경우를 말합니다.

(특정 프로그램에 데이터를 넣어 처리 해야 할때 utf-8의 캐릿터셋만 가능한 경우가 있습니다.)

웹브라우저의 euc-kr 환경에서의 처리는 위부분을 참고하시면 됩니다.



    <!DOCTYPE html>
    <html lang="ko">
    <head>
        <meta charset="EUC-KR">
        <title>jQuery AJAX POST 예제</title>
        <script>
            $(document).ready(function(){
                $("#submitButton").click(function(){
                    var myData = {
                        key1: $("#input1").val(),
                        key2: $("#input2").val()
                    };

                    $.ajax({
                        url: 'your-server-endpoint', // 서버의 URL을 입력하세요.
                        type: 'POST',
                        contentType: 'application/json; charset=utf-8', // 컨텐트 타입 설정
                        data: JSON.stringify(myData),
                        success: function(response) {
                            // 데이터 전송 성공 시 처리할 코드
                            console.log('데이터 전송 성공', response);
                        },
                        error: function(xhr, status, error) {
                            // 오류 발생 시 처리할 코드
                            console.error('데이터 전송 실패', error);
                        }
                    });
                });

                // input2 필드에 숫자만 입력되도록 설정
                $("#input2").on('input', function() {
                    this.value = this.value.replace(/[^0-9]/g, '');
                });
            });
        </script>
    </head>
    <body>
        <input type="text" id="input1" placeholder="key1 값 입력">
        <input type="text" id="input2" placeholder="key2 값 입력 (숫자만)">
        <button id="submitButton">데이터 전송</button>
    </body>
    </html>



 

  • 페이스북으로 공유
  • 트위터로  공유
  • 구글플러스로 공유
전체 194건 1 페이지
  • profile_image 앞으로 @ 사용하지 말라고 하니 새로 만드는 프로그램은 try-catch 감싸서 처리 하는 것이 좋다.그래서 필요한 것으로 아래를 참고하면 된다. 그리고 아래 복원하는 함수면 한 줄이기 때문에 함수가 왜? 필요할까 싶지만 이런 경우도 함수로 만들어 사용하면 후에 어려운 일이 발생 했을 때 해결 할 수 있는 좋은 일이 생기게 되기도 한다.  # 사용자 오류처리기   convertErrorsToExceptions();   #   try {    $…
  • profile_image 내장함수에 strip_tags 라는 것이 있습니다.HTML을 삭제하고 txt만 남기죠. 그리고 나서 공백이 2개 이상이거나 줄바꿈이 필요 없거나 탭 같은것은 별도 삭제를 해줘야 합니다. 여기서 다루는 함수는 자바스크립트등 몇가지를 더 삭제해 주는 기능입니다.결과 확인 후 본인에게 맞지 않으면 좀 더 추가 해야 될 수 있는데 요즘은 GPT4 이용하면 도움이 많이 됩니다.  /**   * html2txt    *    * @param mixed $…
  • profile_image 사이트의 페이지를 소켓방식으로 수집할때 많이 사용하는 curl 클래스 입니다.본인의 상황에 따라서 좀더 조건을 줘서 처리를 하면 되며 쿠키를 저장해서 다시 보내줘야 한 다면 이 부분에 대한 주석 처리 된것을 풀어서 테스트 해보면 됩니다.중요한것은 HTTP 프로토콜에 대한 명확한 이해가 가장 중요합니다.원리를 모르는 상태에서 사용을 하다보면 헛발질을 많이 할 수 밖에 없기 때문이죠~코딩을 잘 한다는 것은 깔끔하게 재사용가능하게 하는 것도 중요하지…
  • profile_image AWS SES API를 활용하면서 PEAR 라이브러리 활용할 필요가 있을 때 사용하면 되지만 일반적으로는 사용할 필요는 없습니다.하지만 필요한 분이 있을 수 있어 예전 소스중에 있어 올립니다. 1) PEAR 설치 사용하는 PHP 버전의 경로를 지정해서 설치 해야 한다. wget https://pear.php.net/go-pear.phar /usr/local/php82/bin/php go-pear.phar /usr/local/php82/bin/p…
  • profile_image AWS에서 메일을 발송하는 방법에는 SMTP 설정을 통한 방법이 있고 다른 하나는 API를 이용한 방법이 있는데여기에선 API를 이용한 방법에 대한 예 입니다.보통 간단하게 조금 보낼때는 관계 없는데 많이 보내게 되면 AWS 비용이 비싸고 반송 메일에 따라 좋지 않으면 패널티도 받기 때문에 AWS 이용은 많이 안하는 편입니다.대량메일 발송서비스만 전문으로 해주는곳을 이용하거나 직접 구축하여 발송을 하게 됩니다.한달 몇 천건 정도면 이것 이용해도…
  • profile_image 간혹 PHP만 설치해서 사용하고 최대한 라이브러리 설치 하지 않게 사용하면서 간단하게 암호화할 필요가 있을 경우 사용 합니다. 가능하면 OpenSSL 라이브러리 사용하는 암호화 방식을 추천 합니다.  그리고 어떤 방식이든 대칭형 암호화에서 키는 가능하면 길게 만들고 여기선 md5 사용 했지만 sha512 같은것 사용하면 더 좋고 시간, 또는 일마다 같은 문자도 암호화 결과가 다르게 만드는것이 좋습니다. 그 부분은 개인의 상황에 맞게 별도의 메소…
  • profile_image 다른 언어에선 셀레리움을 많이 사용하는듯 한데 PHP에서 페이스북에서 만든 웹드라이브를 사용합니다.설치는 어렵지 않으며 여기선 윈도우용 PHP가 이미 설치 되어 있다고 가정하고 웹드라이브 설치 하는것 부터 진행 합니다.▷ 윈도우용 컴포저 다운로드https://getcomposer.org/Composer-Setup.exe▷ 필요한 라이브러리 설치composer require php-webdriver/webdrivercomposer require …