string.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. <?php
  2. /**
  3. * User: 김국현
  4. * Date: 2021-04-04
  5. * Time: 오후 11:01
  6. */
  7. // 문자열이 한글, 영문, 숫자, 특수문자로 구성되어 있는지 검사
  8. function findRegexString(string $str, int $options): bool
  9. {
  10. if (empty($str)) {
  11. return false;
  12. }
  13. $s = '';
  14. for ($i = 0; $i < strlen($str); $i++) {
  15. $c = $str[$i];
  16. $oc = ord($c);
  17. // 한글
  18. if ($oc >= 0xA0 && $oc <= 0xFF) {
  19. if (strtoupper(env('APP_CHARSET', 'UTF-8')) === 'UTF-8') {
  20. if ($options & _HANGUL_) {
  21. $s .= $c . $str[$i + 1] . $str[$i + 2];
  22. }
  23. $i += 2;
  24. } else {
  25. // 한글은 2바이트 이므로 문자하나를 건너뜀
  26. $i++;
  27. if ($options & _HANGUL_) {
  28. $s .= $c . $str[$i];
  29. }
  30. }
  31. } elseif ($oc >= 0x30 && $oc <= 0x39) { // 숫자
  32. if ($options & _NUMERIC_) {
  33. $s .= $c;
  34. }
  35. } elseif ($oc >= 0x41 && $oc <= 0x5A) { // 영대문자
  36. if (($options & _ALPHABETIC_) OR ($options & _ALPHAUPPER_)) {
  37. $s .= $c;
  38. }
  39. } elseif ($oc >= 0x61 && $oc <= 0x7A) { // 영소문자
  40. if (($options & _ALPHABETIC_) OR ($options & _ALPHALOWER_)) {
  41. $s .= $c;
  42. }
  43. } elseif ($oc >= 0x20) { // 공백
  44. if ($options & _SPACE_) {
  45. $s .= $c;
  46. }
  47. } elseif ($oc >= 0x5F) { // `_` 언더바
  48. if ($options & _UNDER_) {
  49. $s .= $c;
  50. }
  51. } else {
  52. if ($options & _SPECIAL_) {
  53. $s .= $c;
  54. }
  55. }
  56. }
  57. // 넘어온 값과 비교하여 같으면 참, 틀리면 거짓
  58. return ($str === $s);
  59. }
  60. // 문자열에 정규식을 적용하여 배열로 만든다.
  61. function countOccurrences(string $str, string $exp): int
  62. {
  63. preg_match_all($exp, $str, $match);
  64. return count($match[0]);
  65. }
  66. // 문자열에 소문자 개수가 몇개인지
  67. function countLowercase(string $str): int
  68. {
  69. return countOccurrences($str, '/[a-z]/');
  70. }
  71. // 문자열에 대문자 개수가 몇개인지
  72. function countUppercase(string $str): int
  73. {
  74. return countOccurrences($str, '/[A-Z]/');
  75. }
  76. // 문자열에 숫자 개수가 몇개인지
  77. function countNumbers(string $str): int
  78. {
  79. return countOccurrences($str, '/[0-9]/');
  80. }
  81. // 문자열에 특수문자 개수가 몇개인지
  82. function countSpecialChars(string $str): int
  83. {
  84. return countOccurrences($str, '/[!@#$%^&*()]/');
  85. }
  86. // 원하는 문자열을 원하는 길에 맞는지 확인해서 조정하는 기능을 합니다.
  87. function cutChar(string $word, int $cut): string
  88. {
  89. $word = substr($word, 0, $cut); // 필요한 길이만큼 취함.
  90. for ($k = $cut - 1; $k > 1; $k--) {
  91. if (ord(substr($word, $k, 1)) < 128) {
  92. break; // 한글값은 160 이상.
  93. }
  94. }
  95. return substr($word, 0, $cut - ($cut - $k + 1) % 2);
  96. }
  97. // UTF-8 자르기
  98. function cutCharUtf8(string $word, int $cut, string $mask = '...'): string
  99. {
  100. if($cut <= 0) {
  101. return $word;
  102. }
  103. preg_match_all('/[\xE0-\xFF][\x80-\xFF]{2}|./', $word, $match); // target for BMP
  104. $m = $match[0];
  105. $len = strlen($word); // length of source string
  106. if ($len <= $cut) {
  107. return $word;
  108. }
  109. $ret = [];
  110. $count = 0;
  111. for ($i = 0; $i < $cut; $i++) {
  112. $count += (strlen($m[$i]) > 1) ? 2 : 1;
  113. if ($count > $cut) {
  114. break;
  115. }
  116. $ret[] = $m[$i];
  117. }
  118. return (join('', $ret) . $mask);
  119. }
  120. // base encode 확인
  121. function isBase64($s = ""): bool
  122. {
  123. return (bool)preg_match('/^[a-zA-Z0-9\/\r\n+]*={0,2}$/', $s);
  124. }
  125. // 절대 경로 삭제 (../../../)
  126. function canonicalizePath($path): string
  127. {
  128. $path = array_filter(explode(DIRECTORY_SEPARATOR, $path));
  129. $stack = [];
  130. foreach ($path as $seg) {
  131. if ($seg == '..') {
  132. array_pop($stack);
  133. continue;
  134. }
  135. if ($seg == '.') {
  136. continue;
  137. }
  138. $stack[] = $seg;
  139. }
  140. return (DIRECTORY_SEPARATOR . implode(DIRECTORY_SEPARATOR, $stack));
  141. }
  142. // alert 에서 php 개행이 되도록 예외처리 한다.
  143. function nl2nr(string $s): string
  144. {
  145. $s = preg_replace('/(\r\n|\r|\n)/', '\n', addslashes($s)); // 줄바꿈 되도록 출력
  146. $s = strip_tags(trim($s), '<br/>'); // 태그 제거, 공백 제거
  147. return preg_replace('/<br[^>]*>/i', '\n\n', $s); // br 태그를 \n로 개행 alert 에서 다음줄로 하기 위함.
  148. }