통합검색
로그인
회원가입
Open menu
로그인
회원가입
통합검색
Synology
7
AWS
5
Linux
30
PHP
9
Python
3
Javascript
24
HTML / CSS
12
ETC
4
떡볶이집앞 사진관
Synology
7
AWS
5
Linux
30
PHP
9
Python
3
Javascript
24
HTML / CSS
12
ETC
4
떡볶이집앞 사진관
PHP
[PHP] 에디터로 작성한 HTML 코드 중 <img> 와 <img> 사이에 <br> 태그 두개 넣기.
본인이 운영하는 블로그는 다수의 사진이 입력되는 게시글이 많다. 오랜 기간 블로그 글을 작성하다 보니, 게시글 마다 사진과 사진 사이 여백이 제각각이다. 에디터로 작성된 html코드 중에서 정규식을 통해 <img> 와 <img> 태그 사이를 찾아 <br> 태그가 없거나, 2개 미만 이거나, 2개를 초과하는 경우 무조건 <br> 두개가 삽입 되도록 코드를 변경하여 출력해 줬다. <img>와 <img>를 찾아 적용 모든 <img>와 <img> 사이를 찾아 <br> 두개를 입력해 준다. // 정규식으로 각 <img> 태그 사이에서 <br>을 최대 2개만 남기기 (없거나 2개 미만일 때도 2개로 맞춤) $pattern = '/(<img[^>]*>)(\s*(<br\s*\/?>\s*)*)/i'; $replacement = '$1<br><br>'; $result = preg_replace($pattern, $replacement, $html); echo $result; <img class="lazy">와 <img class="lazy"> 사이만 찾아 적용 img 태그에 class="lazy" 와 같이 특정한 조건에 부합하는 경우에만 적용한다. // 정규식으로 class="lazy"가 있는 <img> 태그에만 적용 $pattern = '/(<img[^>]*class="lazy"[^>]*>)(\s*(<br\s*\/?>\s*)*)/i'; $replacement = '$1<br><br>'; $result = preg_replace($pattern, $replacement, $html); echo $result;
[PHP] 배경색(HEX 코드) 판별하여 적합한 글자색(흰색/검정색) 반환
Element에 배경색과 배경색 위에 얹혀질 글자 색을 지정하는 경우 배경색이 밝은지 어두운지 판별하여 횐색/검정 글자중 적합한 색을 반환해 주는 함수. 코드에 HEX코드를 넣어주면 결과 값으로 black 혹은 white를 반환해준다. 배경색에 따라 white / black 반환 아래와 같이 함수에 HEX값 (배경색)을 넣어주면 white / black을 반환해 준다. // 글자색 반환 함수 function get_text_color($hex) { $rgb = sscanf($hex, "#%2x%2x%2x"); $brightness = (($rgb[0] * 299) + ($rgb[1] * 587) + ($rgb[2] * 114)) / 1000; return ($brightness > 125) ? 'black' : 'white'; } // 글자색 반환 실행 get_text_color('#000000'); // 결과 값 : 'white' 반환 위 함수는 아래와 같이 활용할 수 있다.
[PHP] sms 본문 내용 byte 계산 (멀티바이트로 계산하기 - 한글 2byte)
SMS의 내용을 byte로 계산할 때 일반적으로 한글, 특수문자는 2byte, 영어, 숫자 줄바꿈등은 1byte로 계산한다. 한글을 php나, javascript에서 UTF-8의 byte를 계산하는 경우 3byte로 계산하는데, sms 서비스의 경우 한글을 2byte로 계산해야 한다. mb_strwidth() 함수를 사용한 byte 계산 아래와 같이 멀티바이트 (string width)로 계산하면 한글을 2byte로 계산할 수 있다. function getByteLength($str) { $strlen = mb_strwidth(str_replace("\r\n", "\n", $str), 'UTF-8'); return $strlen; } 위 코드 중 str_replace("\r\n", "\n", $str) 코드는 리눅스의 경우 줄바꿈을 \r\n 으로 처리하기 때문에 2byte가 되는데, 이를 윈도우 기준인 \n으로 치환하여 1byte로 계산 하도록 한다.
[PHP] microtime과 랜덤 문자를 조합하여 중복되지 않는 PK 문자 만들기
microtime() 과 랜덤 글자 조합하여 중복되지 않는 Primary Key 문자를 생성하는 함수. 함수의 인자 값으로 원하는 길이를 넘기면 랜덤 문자열과 microtime()을 조합 후, 다시 str_shuffle()로 무작위로 섞은 결과 문자열을 return 해준다. ($length는 최소 30자 이상 설정 가능) Primary Key 생성 함수 function make_random_char($length = 30) { $length = ($length < 30) ? 30 : $length; $length = $length - 19; $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $randomString = ''; $max = strlen($characters) - 1; for ($i = 0; $i < $length; $i++) { $randomString .= $characters[mt_rand(0, $max)]; } $microtime = str_replace(array(' ', '.'), array('', ''), microtime()); return str_shuffle($randomString.$microtime); // 문자열을 다시 무작위로 섞음 } 결과 예시 4q344nM250001GS69e2y2X61198mT1
[PHP] 연락처가 올바른 연락처인지 검증하는 함수
연락처가 올바른 연락처인지 검증하는 함수. 함수에 연락처를 인자로 전달할 때 하이픈(-)을 포함하여야 한다. - 000-000-0000 (휴대전화번호) - 000-0000-0000 (휴대전화번호) - 00-000-0000 (유선전화번호) - 00-0000-0000 (유선전화번호) - 000-000-0000 (유선전화번호) - 000-0000-0000 (유선전화번호) - 0000-0000 (대표전화번호) <?php function get_phone_check($number) { if (!preg_match('/^[0-9-]/', $number)) return false; if (!preg_match('/^0(2|[3-9]\d{1})-?\d{3,4}-?\d{4}$|^01([016789])-?\d{3,4}-?\d{4}|\d{4}-\d{4}$/', $number)) return false; return true; } ?>
[PHP] 연락처가 휴대전화 번호인지 유선전화번호인지 확인하는 함수
연락처가 휴대전화 번호인지 유선전화 번호인지 검증하는 함수. 휴대전화 번호라면, 'phone'을, 그 외 유선전화 번호라면 'tel'을 반환한다. 함수에 연락처를 인자로 전달할 때 하이픈(-)을 포함하여야 한다. <?php function get_phone_type($number) { $is_phone_number = preg_match('/^01([016789])-?\d{3,4}-?\d{4}$/', $number); $is_tel_number = preg_match('/^(0\d{1,2}[-\s]?)?\d{3,4}[-\s]?\d{4}$/', $number); if (!$is_phone_number && !$is_tel_number) return false; return ($is_phone_number) ? 'phone' : 'tel'; } ?>
[PHP] 숫자만 입력한 연락처에 자동으로 하이픈(-) 추가해주는 함수
하이픈(-) 없이 입력한 휴대전화번호, 유선전화번호에 자동으로 하이픈을 반환해주는 함수. 지원되는 연락처는 아래와 같다. - 000-000-0000 (휴대전화번호) - 000-0000-0000 (휴대전화번호) - 00-000-0000 (유선전화번호) - 00-0000-0000 (유선전화번호) - 000-000-0000 (유선전화번호) - 000-0000-0000 (유선전화번호) - 0000-0000 (대표전화번호) <?php function set_add_phone_hipen($value) { if (!$value) return ""; $value = preg_replace('/[^0-9]/', '', $value); $result = array(); $restNumber = ""; if (strpos($value, "02") === 0) { $result[] = substr($value, 0, 2); $restNumber = substr($value, 2); } elseif (strpos($value, "1") === 0) { $restNumber = $value; } else { $result[] = substr($value, 0, 3); $restNumber = substr($value, 3); } if (strlen($restNumber) === 7) { $result[] = substr($restNumber, 0, 3); $result[] = substr($restNumber, 3); } else { $result[] = substr($restNumber, 0, 4); $result[] = substr($restNumber, 4); } return implode("-", array_filter($result)); } ?>
[PHP] pdo를 class의 __construct(생성자) 로 연결하는 경우 인스턴스 여러개 만들어도 한번만 연결 되도록 하기
내가 직접 개발한 CMS를 실무에 잘 사용해 오다, 최근 비교적 복잡한 기능을 개발하다 치명적인 문제점을 발견하게 됐다. mariadb를 pdo로 접속해서 php와 연동하여 사용하는데, php 코드에서 필요할 때 마다 pdo접속 Class를 인스턴스로 매번 생성하여 사용한다. (아래 예시) $db = new PdoClass(); $db2 = new PdoClass(); $db3 = new PdoClass(); ... PdoClass() 함수는 __construct() (생성자 함수) 로 pdo에 자동 접속되도록 구성되어 있다. (new PDO) 즉, 위 코드대로 라면 pdo 접속이 3번 연달아 발생하게 되는 것이다. 오랜 기간 동안 pdo 중복 접속으로 인해 DB 성능이 저하되고 있다는 것을 간과하고 있었다. (특정 웹페이지는 무려 20번 이상의 pdo 중복 연결이 이뤄지고 있었었으며, 페이지 로딩 시간은 500ms 에 달했다.) 특히나, 내가 운영중인 서비스의 경우 외부DB 서버를 이용하고 있어 체감되는 접속 지연은 배가 되었다. 지금이라도 발견 했으니 다행이라 생각한다. 기본 중의 기본을 실수해 버렸고, 기본 중의 기본인 방법으로 이를 해결했다. 최초 인스턴스 생성시 다수의 인스턴스가 생성 되어도 1개만 존재할 수 있는 static 변수에 pdo 객체를 저장한다. 이후 두번째 인스턴스 연결 부터는 static 변수에 저장된 객체가 있다면 중복 연결 하지 않고 기존의 pdo객체를 재활용 하게 된다.
[PHP] 날짜를 SNS처럼 텍스트로 표현하기 ( ~일 전 / ~시간 전 / 방금 )
날짜를 SNS처럼 ~일 전 / ~시간 전 등 문자로 표현하는 방법이다. 아래 예제 코드를 참고하여 적용하면 된다. <?php function print_time($datetime) { $lag = time() - strtotime($datetime); if($lag < 60) { $posting_time = "방금"; } elseif($lag >= 60 and $lag < 3600) { $posting_time = floor($lag/60)."분 전"; } elseif($lag >= 3600 and $lag < 86400) { $posting_time = floor($lag/3600)."시간 전"; } elseif($lag >= 86400 and $lag < 2419200) { $posting_time = floor($lag/86400)."일 전"; } else { $posting_time = date("y-m-d", strtotime($datetime)); } return $posting_time; } ?> 1. 글을 쓴 지 60초 미만일 경우 - "방금" 이라고 표기 2. 글을 쓴 지 60초(1분) 이상 3600초(1시간) 미만일 경우 - "X분 전" 이라고 표기 3. 글을 쓴 지 3600초(1시간) 이상 86400초(1일) 미만일 경우 - "X시간 전" 이라고 표기 4. 글을 쓴 지 86400초(1일) 이상 2419200초(28일) 미만일 경우 - "X일 전" 이라고 표기 5. 글을 쓴지 28일 이상일 경우 - "년-월-일" 이 표기
1