PHP 문자열에서 utf8 이모지 삭제 하기
이모지는 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>
관련링크