php 문자열처리 관련 function

yyyy년mm월dd일 포멧의 날짜를 yyyymmdd 형식으로 바꾸는 다양한 방법들.

$date = ‘2010년04월20일’; // 형태는 4년2월2일

이 값에서 숫자 부분인 ‘20100420’만 뽑는 방법입니다.



먼저 문자열(배열 관련 함수를 많이 사용하지만) 처리 방법입니다.


▶ 문자열 처리 #1

고정 길이기 때문에 substr() 함수를 이용합니다.

────────────────────────────────────────
$date = substr($date,0,4).substr($date,6,2).substr($date,10,2);
────────────────────────────────────────

substr() : http://php.net/manual/kr/function.substr.php

참고로 .은 문자열 결합 연산자입니다.
String Operators : http://php.net/manual/kr/language.operators.string.php



▶ 문자열 처리 #2

str_replace() 함수를 이용해 년, 월, 일 문자를 제거합니다.

────────────────────────────────────────









1 $date = str_replace(‘년’,,$date); // 201004월20일






2 $date = str_replace(‘월’,,$date); // 20100420일






3 $date = str_replace(‘일’,,$date); // 20100420
────────────────────────────────────────

str_replace() : http://php.net/manual/kr/function.str-replace.php

참고로 해석이 필요없는 문자열 값은 ‘(Single Quote)로 감싸주세요.
문자열 관련 : http://php.net/manual/en/language.types.string.php


▶ 문자열 처리 #3

strtr() 함수를 이용하면 #2 과정을 한 번에 처리할 수 있습니다.

────────────────────────────────────────
$remove[‘년’] = ”;
$remove[‘월’] = ”;
$remove[‘일’] = ”;

// 또는

$remove = array(‘년’=>”,’월’=>”,’일’=>”);

// 둘 중 편한 형태로 미리 연관 배열을 할당합니다.

$date = strtr($date,$remove);

// 물론 변수에 담지 않고 바로 이용도 가능합니다.

$date = strtr($date,array(‘년’=>”,’월’=>”,’일’=>”));
────────────────────────────────────────

strtr() : http://php.net/manual/en/function.strtr.php
연관 배열 : http://php.net/manual/kr/language.types.array.php


▶ 문자열 처리 #4

explode() 함수를 이용해 년, 월, 일을 잘라줍니다.

────────────────────────────────────────
$a = explode(‘년’,$date); // [0] => 2010 [1] => 04월20일
$b = explode(‘월’,$a[1]); // [0] => 04 [1] => 20일
$c = explode(‘일’,$b[1]); // [0] => 20 [1] =>
$date = $a[0].$b[0].$c[0];
────────────────────────────────────────

reset() 함수로 배열의 첫 번째 값을 쉽게 가져올 수 있습니다.
array_shift() 함수로 배열의 첫 번째 값을 뺄 수 있습니다.

explode() : http://php.net/manual/kr/function.explode.php
reset() : http://php.net/manual/kr/function.reset.php
array_shift() : http://php.net/manual/kr/function.array-shift.php


▶ 문자열 처리 #5

list() 함수를 이용하면 #4 변수 사용이 좀 더 간편해집니다.

────────────────────────────────────────
list($y,$date) = explode(‘년’,$date); // $y=2010, $date=04월20일
list($m,$d) = explode(‘월’,$date); // $m=04, $d=20일
list($d) = explode(‘일’,$d); // $d=20
$date = $y.$m.$d;
────────────────────────────────────────

list() : http://php.net/manual/kr/function.list.php


▶ 문자열 처리 #6

explode()와 함께하는 implode() 함수를 이용해보겠습니다.

────────────────────────────────────────
$date = implode(”,explode(‘년’,$date));
$date = implode(”,explode(‘월’,$date));
$date = implode(”,explode(‘일’,$date));
────────────────────────────────────────

implode() : http://php.net/manual/kr/function.implode.php


▶ 문자열 처리 #7

sscanf() 함수를 이용하면 형식에 맞게 값을 뽑을 수 있습니다.
다 만, 앞에 0이 붙었으면 0을 제거해주기 때문에 조정이 필요합니다.

────────────────────────────────────────
$temp = sscanf($date,’%4d년%2d월%2d일’); // [0] => 2010 [1] => 4 [2] => 20
if ( $temp[1]<10 ) $temp[1] = ‘0’.$temp[1]; // 4 => 04
if ( $temp[2]<10 ) $temp[2] = ‘0’.$temp[2];
$date = implode(”,$temp); // $date = $temp[0].$temp[1].$temp[2];
────────────────────────────────────────

sscanf() : http://php.net/manual/kr/function.sscanf.php


▶ 문자열 처리 #8

#7의 코드에 그 위에서 언급한 list() 함수를 이용해볼까요?

────────────────────────────────────────
list($y,$m,$d) = sscanf($date,’%4d년%2d월%2d일’); // $y=2010, $m=4, $d=20
if ( $m<10 ) $m = ‘0’.$m;
if ( $d<10 ) $d = ‘0’.$d;
$date = $y.$m.$d;
────────────────────────────────────────

참고로 each() 함수를 살펴보세요. list() 함수와 궁합이 좋습니다.
each() : http://php.net/manual/kr/function.each.php


▶ 문자열 처리 #9

sscanf()에서 곧바로 변수 할당도 가능합니다.
이번에는 sprintf() 함수로 형식에 맞는 문자열을 만들어보겠습니다.

────────────────────────────────────────
sscanf($date,’%4d년%2d월%2d일’,$y,$m,$d); // $y=2010, $m=4, $d=20
$date = sprintf(‘%04d%02d%02d’,$y,$m,$d);
────────────────────────────────────────

sprintf() : http://php.net/manual/kr/function.sprintf.php


▶ 문자열 처리 #10

strpos() 함수를 이용하면 지정한 문자(열)의 위치를 구할 수 있습니다.

────────────────────────────────────────
$py = strpos($date,’년’); // 4
$pm = strpos($date,’월’); // 8
$pd = strpos($date,’일’); // 12
$date = substr($date,0,$py).substr($date,$py+2,2).substr($date,$pm+2,2);
────────────────────────────────────────

strpos() : http://php.net/manual/kr/function.strpos.php


▶ 문자열 처리 #11

이번에는 고전적인 방법을 이용해보겠습니다.
문자열의 길이만큼 반복하며 1바이트씩 읽어 숫자일 때 붙여주는 것이죠.
먼저 풀어쓴 코드부터 보시죠.

────────────────────────────────────────
$original = $date; // $original에 기존 $date값을 할당
$len = strlen($date); // 문자열 길이 구해주고
$date = ”; // 결과값을 이곳에 담기 위해 빈 문자열로
for ($i=0;$i<$len;$i++) // 길이만큼 반복
{
    if ( is_numeric($original[$i]) ) $date.= $original[$i]; // 숫자인 경우 붙임
}
────────────────────────────────────────

for() : http://php.net/manual/kr/control-structures.for.php
strlen() : http://php.net/manual/kr/function.strlen.php
is_numeric() : http://php.net/manual/kr/function.is-numeric.php
ctype_digit() : http://php.net/manual/kr/function.ctype-digit.php

편 의상 is_numeric() 함수를 이용했습니다.
그리고 위에서 보다시피 ‘2010년04월20일’은 문자열 값이지만
[] 를 이용해 배열처럼 접근할 수 있습니다.


▶ 문자열 처리 #12

#11보다 더 고전적인 방법입니다. 아스키 값을 이용합니다.

────────────────────────────────────────
$original = $date; // $original에 기존 $date값을 할당
$len = strlen($date); // 문자열 길이 구해주고
$date = ”; // 결과값을 이곳에 담기 위해 빈 문자열로
for ($i=0;$i<$len;$i++) // 길이만큼 반복
{
    $c = $original[$i]; // 1바이트 문자
    $asc = ord($c); // 아스키 코드
    if ( $asc<48 || $asc>57 ) continue; // 숫자 범위 아니면 Skip
    $date.= $c;
}
────────────────────────────────────────

숫자 범위가 아니면 위와 같은 조건이면 됩니다.
숫자 범위로 조건을 바꾼다면? ( $asc>47 && $asc<58 )입니다.

참고로 <= 비교보다 < 비교가 빠릅니다.
그래 서 ( $asc>=48 && $asc<=57 )로 하기보다 위 조건을 권장합니다.
누누이 강조하는 부분이지만 쓰기 나름이니까 편한 대로 쓰면 됩니다.

또는 어차피 숫자 외의 문자열이라봐야 년, 월, 일이니
아 스키 값이 127 이상인 경우를 걸러주면 됩니다.

ord() : http://php.net/manual/kr/function.ord.php
ASCII Table : http://www.asciitable.com/


▶ 문자열 처리 #13

#11, #12의 for()문을 줄인 형태입니다.

────────────────────────────────────────
for($i=0,$o=$date,$date=”,$l=strlen($o);$i<$l;$i++)if(is_numeric($o[$i]))$date.=$o[$i];
────────────────────────────────────────


▶ 문자열 처리 #14

#13 을 아예 for()문으로 끝내는 것도 가능합니다.

────────────────────────────────────────
for ($i=0,$l=strlen($o=$date),$date=”;$i<$len;$i++,$date.=is_numeric($o[$i-1])?$o[$i-1]:”);
────────────────────────────────────────

빠질 뻔 했는데 값의 할당은 오른쪽부터 왼쪽으로 진행됩니다.
$l=strlen($o=$date)
$o에 $date가 할당되고, $o의 길이가 $l에 할당됩니다.
할당 연산자 : http://php.net/manual/kr/language.opera ··· ment.php
연산자 우선권 : http://php.net/manual/kr/language.opera ··· ence.php


▶ 문자열 처리 #15

“키=값” 형태로 가공해 parse_str() 함수를 이용하는 방법입니다.

────────────────────────────────────────
$date = ‘y=’.substr($date,0,-2); // y=2010년04월20
$date = str_replace(‘년’,’&m=’,$date); // y=2010&m=04월20
$date = str_replace(‘월’,’&d=’,$date); // y=2010&m=04&d=20
parse_str($date);
$date = $y.$m.$d;

────────────────────────────────────────

parse_str() 함수를 보면, extract() 함수가 떠오르죠.

parse_str() : http://php.net/manual/kr/function.parse-str.php
extract() : http://php.net/manual/kr/function.extract.php

두 번째 인자를 주면 그 변수에 값을 받게 됩니다.

‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
// 위 3줄 동일
parse_str($date,$t); // ‘y’=>’2010’, ‘m’=>’04’, ‘d’=>’20’
$date = implode(”,$t); // $date = $t[‘y’].$t[‘m’].$t[‘d’];
‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥


▶ 문자열 처리 #16

#11 ~ #14의 코드와 비슷합니다.
[]를 이용해 문자열도 배열 형태로 접근이 가능하다고 했죠?
이번에는 문자열을 정말 배열로 만들어 처리해보겠습니다.
그리고 똑같은 코드로 하면 재미없으니 다른 코드를 부르겠습니다.

────────────────────────────────────────
$temp = str_split($date);
$date = ”;
foreach ( $temp as $char )
{
    if ( ord($char)<128 ) $date.= $char;
}
────────────────────────────────────────

1바이트로 나눠 배열 끝까지 반복, 아스키 값 비교로 결과값을 구합니다.
foreach()도 참 유용한 제어 구조 중 하나입니다. 배열과 찰떡 호흡!

str_split() : http://php.net/manual/kr/function.str-split.php
foreach() : http://php.net/manual/kr/control-structures.foreach.php


‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
$t=str_split($date);$date=”;
foreach($t as $c)if(ord($c)<128)$date.=$c;
‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥


▶ 문자열 처리 #17

substr_replace()를 깜빡했군요. str_replace()와 비교해보는 재미를···.

────────────────────────────────────────
$date = substr_replace($date,”,4,2); // 201004월20일
$date = substr_replace($date,”,6,2); // 20100420일
$date = substr_replace($date,”,8,2); // 20100420
────────────────────────────────────────

substr_replace() : http://php.net/manual/en/function.substr-replace.php



정규식으로 처리하는 방법 역시 다양합니다.


■ 정규식 처리 #1

제 일 간단한 방법은 숫자 외의 문자를 제거하는 것입니다.

────────────────────────────────────────
$date = preg_replace(‘/\D/’,”,$date);
────────────────────────────────────────

10진 숫자가 아닌 임의의 문자(\D)를 ”로 치환해주는 방법이죠.

정규 표현식 상세 : http://php.net/manual/kr/regexp.reference.php
정규 표현식 : http://php.net/manual/en/reference.pcre ··· ntax.php

임의의 10진 숫자는 \d로 표현합니다. 또는 [0-9]로 표현하죠.
여기에 부정 클래스를 사용하면 반대가 됩니다.

‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
$date = preg_replace(‘/[^0-9]/’,”,$date);
$date = preg_replace(‘/[^\d]/’,”,$date);
‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥

preg_replace() : http://php.net/manual/kr/function.preg-replace.php

참 고로 ereg_replace(), eregi_replace() 등 POSIX Regex 관련 함수들은
PHP 5.3 버전부터 중지됩니다.
POSIX Regex 관련 함수 : http://php.net/manual/kr/ref.regex.php

그러니 어서 펄 호환 정규식으로 갈아타시길···.
Regular Expressions (Perl-Compatible) : http://php.net/manual/kr/book.pcre.php


■ 정규식 처리 #2

숫자만 뽑아 묶어주는 방법입니다.

────────────────────────────────────────
preg_match_all(‘/\d/’,$date,$matches);
$date = implode(”,$matches[0]);
────────────────────────────────────────

위 와 같이 실행했을 때 $matches의 값입니다.
문자열 처리 과정에서 언급한 implode() 함수로 깔끔하게 묶어주면 됩니다.

‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
Array
(
    [0] => Array
        (
            [0] => 2
            [1] => 0
            [2] => 1
            [3] => 0
            [4] => 0
            [5] => 4
            [6] => 2
            [7] => 0
        )
)
‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥

preg_match_all() : http://php.net/manual/kr/function.preg-match-all.php


■ 정규식 처리 #3

preg_split() 함수로 대놓고 년, 월, 일로 잘라줘도 됩니다.

────────────────────────────────────────
list($y,$m,$d) = preg_split(‘/년|월|일/’,$date);
$date = $y.$m.$d;
────────────────────────────────────────

preg_split() : http://php.net/manual/kr/function.preg-split.php

차근차근 읽어본 경우라면 위 두 줄의 코드를 한 줄로 바꿀 수 있겠죠?

‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
$date = implode(”,preg_split(‘/년|월|일/’,$date));
‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥


■ 정규식 처리 #4

#1의 코드와 기본은 같고 메타 문자만 다릅니다.

────────────────────────────────────────
$date = preg_replace(‘/\W/’,”,$date);
────────────────────────────────────────

어떠한 문자나 숫자, _가 \w며, \W는 그 반대입니다.
특성이 있지만, 년, 월, 일 정도야···. ^^);;;


■ 정규식 처리 #5

preg_grep()의 활용 예를 위해 하나 더 추가합니다.
str_split() 함수와 마찬가지로 잘라주고, 숫자 부분만 가져다 묶어줍니다.

────────────────────────────────────────
$split = preg_split(‘//’,$date,-1,PREG_SPLIT_NO_EMPTY);
$date = implode(”,preg_grep(‘/\d/’,$split));
────────────────────────────────────────

preg_grep() : http://php.net/manual/kr/function.preg-grep.php

‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
$date = implode(”,preg_grep(‘/\d/’,preg_split(‘/()/’,$date,-1,PREG_SPLIT_NO_EMPTY)));
‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥


■ 정규식 처리 #6

#2 에서 preg_match_all()을 사용했죠? 이번에는 preg_match() 사용입니다.

────────────────────────────────────────
preg_match(‘/(\d+)년(\d+)월(\d+)일/’,$date,$match);
$date = implode(”,array_slice($match,1));
────────────────────────────────────────

$match의 값은 아래와 같습니다.

‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
Array
(
    [0] => 2010년04월20일
    [1] => 2010
    [2] => 04
    [3] => 20
)
‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥

여기서 array_slice() 함수를 이용해 두 번째 배열부터 가져와 묶어줍니다.
문자열의 substr() 함수와 사용 방법이 같습니다. 대상만 배열이죠.

preg_match() : http://php.net/manual/kr/function.preg-match.php
array_slice() : http://php.net/manual/kr/function.array-slice.php



■ 정규식 처리 #7

응용 예입니다.

────────────────────────────────────────
preg_match(‘/(\d+)(\W.)(\d+)(\W.)(\d+)(\W.)/’,$date,$matches);
$date = $matches[1].$matches[3].$matches[5];
────────────────────────────────────────

$matches 값은 아래와 같습니다.

‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
Array
(
    [0] => 2010년04월20일
    [1] => 2010
    [2] => 년
    [3] => 04
    [4] => 월
    [5] => 20
    [6] => 일
)
‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥



▣ 날짜 함수 이용

문자열 처리 응용, strtotime() 함수와 date() 함수가 등장합니다.
년, 월, 일을 제거하면 그것으로 끝이지만 응용 차원에서 추가했습니다.
참. 꼭 -으로 바꿀 필요는 없습니다.

────────────────────────────────────────
$date = str_replace(‘년’,’-‘,$date); // 2010-04월20일
$date = str_replace(‘월’,’-‘,$date); // 2010-04-20일
$date = str_replace(‘일’,”,$date); // 2010-04-20
$date = date(‘Ymd’,strtotime($date));
────────────────────────────────────────

strtotime() : http://php.net/manual/en/function.strtotime.php
date() : http://php.net/manual/kr/function.date.php

한 줄로 줄이려면? 문자열 처리 #3에서 언급한 strtr()을 사용하면 됩니다.

‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
echo date(‘Ymd’,strtotime(strtr($date,array(‘년’=>’/’,’월’=>’/’,’일’=> ”))));
‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥

댓글

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다