2013-03-13

preg_split()과 PCRE Patterns

참고 페이지: http://apmusers.com/tt/dbckdghk/136
php PCRE patterns: http://www.php.net/manual/en/regexp.reference.delimiters.php

문자열을 배열로 나눌 때 쓰던 split 함수의 편리함은 나누는 기준 (needle) 이 되는 문자를 다수 정의 (pattern) 할 수 있다는 점이다.

$temp = "This is good, but I cannot see that. What is it?";
$temparray = split(",.?", $temp);
// 결과는 다음과 같다.
// $temparray[0] = "This is good"
// $temparray[1] = " but I cannot see that"
// $temparray[2] = " What is it"

문제는 이 함수가 php 5.2 이상에서는 쓰지 않는 것으로 (deprecated) 바뀌었다. 이 함수를 대체하기엔 explode 함수는 조금 부족한 게 사실인 것이 needle을 오직 하나의 문자열 (delimiter) 로만 정의할 수 있다는 점이다.

물론 대안으로 preg_split() 함수가 제시되고 있다. 사용법은 거의 동일한데 조금 다른 것은 needle pattern을 정규식 (regular expression)으로 정의해야 한다는 점이다. 일단 위 예를 이 함수를 이용해서 바꿔보자.

$temp = "This is good, but I cannot see that. What is it?";
$temparray = preg_split("/[,\.\?]/", $temp, -1, PREG_SPLIT_NO_EMPTY);
// PREG_SPLIT_NO_EMPTY 옵션은 빈 항목을 제거한다.
// 결과는 다음과 같다.
// $temparray[0] = "This is good"
// $temparray[1] = " but I cannot see that"
// $temparray[2] = " What is it"

별로 달라진 점이 없어보이는데, preg_split 함수 안에 있는 pattern 이 정규식으로 표현되어 있다는 것 (/ /로 둘러싸여진 부분) 이다. 그럼 이 정규식은 또 뭔가? 찾아보니 PCRE (Perl Compatible Regular Expressions) patterns 이란다. 어렵다기보다는 생각을 표현하는 방법이 다르니 다시 공부를 해야 할 입장이다.

No comments:

Post a Comment