= 0xA0 && $oc <= 0xFF) {
if (strtoupper(env('APP_CHARSET', 'UTF-8')) === 'UTF-8') {
if ($options & _HANGUL_) {
$s .= $c . $str[$i + 1] . $str[$i + 2];
}
$i += 2;
} else {
// 한글은 2바이트 이므로 문자하나를 건너뜀
$i++;
if ($options & _HANGUL_) {
$s .= $c . $str[$i];
}
}
} elseif ($oc >= 0x30 && $oc <= 0x39) { // 숫자
if ($options & _NUMERIC_) {
$s .= $c;
}
} elseif ($oc >= 0x41 && $oc <= 0x5A) { // 영대문자
if (($options & _ALPHABETIC_) OR ($options & _ALPHAUPPER_)) {
$s .= $c;
}
} elseif ($oc >= 0x61 && $oc <= 0x7A) { // 영소문자
if (($options & _ALPHABETIC_) OR ($options & _ALPHALOWER_)) {
$s .= $c;
}
} elseif ($oc >= 0x20) { // 공백
if ($options & _SPACE_) {
$s .= $c;
}
} elseif ($oc >= 0x5F) { // `_` 언더바
if ($options & _UNDER_) {
$s .= $c;
}
} else {
if ($options & _SPECIAL_) {
$s .= $c;
}
}
}
// 넘어온 값과 비교하여 같으면 참, 틀리면 거짓
return ($str === $s);
}
// 문자열에 정규식을 적용하여 배열로 만든다.
function countOccurrences(string $str, string $exp): int
{
preg_match_all($exp, $str, $match);
return count($match[0]);
}
// 문자열에 소문자 개수가 몇개인지
function countLowercase(string $str): int
{
return countOccurrences($str, '/[a-z]/');
}
// 문자열에 대문자 개수가 몇개인지
function countUppercase(string $str): int
{
return countOccurrences($str, '/[A-Z]/');
}
// 문자열에 숫자 개수가 몇개인지
function countNumbers(string $str): int
{
return countOccurrences($str, '/[0-9]/');
}
// 문자열에 특수문자 개수가 몇개인지
function countSpecialChars(string $str): int
{
return countOccurrences($str, '/[!@#$%^&*()]/');
}
// 원하는 문자열을 원하는 길에 맞는지 확인해서 조정하는 기능을 합니다.
function cutChar(string $word, int $cut): string
{
$word = substr($word, 0, $cut); // 필요한 길이만큼 취함.
for ($k = $cut - 1; $k > 1; $k--) {
if (ord(substr($word, $k, 1)) < 128) {
break; // 한글값은 160 이상.
}
}
return substr($word, 0, $cut - ($cut - $k + 1) % 2);
}
// UTF-8 자르기
function cutCharUtf8(string $word, int $cut, string $mask = '...'): string
{
if($cut <= 0) {
return $word;
}
preg_match_all('/[\xE0-\xFF][\x80-\xFF]{2}|./', $word, $match); // target for BMP
$m = $match[0];
$len = strlen($word); // length of source string
if ($len <= $cut) {
return $word;
}
$ret = [];
$count = 0;
for ($i = 0; $i < $cut; $i++) {
$count += (strlen($m[$i]) > 1) ? 2 : 1;
if ($count > $cut) {
break;
}
$ret[] = $m[$i];
}
return (join('', $ret) . $mask);
}
// base encode 확인
function isBase64($s = ""): bool
{
return (bool)preg_match('/^[a-zA-Z0-9\/\r\n+]*={0,2}$/', $s);
}
// 절대 경로 삭제 (../../../)
function canonicalizePath($path): string
{
$path = array_filter(explode(DIRECTORY_SEPARATOR, $path));
$stack = [];
foreach ($path as $seg) {
if ($seg == '..') {
array_pop($stack);
continue;
}
if ($seg == '.') {
continue;
}
$stack[] = $seg;
}
return (DIRECTORY_SEPARATOR . implode(DIRECTORY_SEPARATOR, $stack));
}
// alert 에서 php 개행이 되도록 예외처리 한다.
function nl2nr(string $s): string
{
$s = preg_replace('/(\r\n|\r|\n)/', '\n', addslashes($s)); // 줄바꿈 되도록 출력
$s = strip_tags(trim($s), '
'); // 태그 제거, 공백 제거
return preg_replace('/
]*>/i', '\n\n', $s); // br 태그를 \n로 개행 alert 에서 다음줄로 하기 위함.
}