PHP

[PHP] 4장 문자열 연산과 정규 표현식(2)

정규 표현식(Regex Expression)

정규 표현식은 PHP와 별개의 또 다른 학문이다. 필자도 정규 표현식에 아직 익숙하지 않기 때문에 PHP 메뉴얼의 링크를 많이 참조할 것이며 설명은 최대한 간단히 하려고 한다.

PHP는 POSIXPerl(PCRE)이라는 두 가지 스타일의 정규 표현식을 지원한다. PHP 메뉴얼에 의하면 POSIX 스타일은 PHP 5.3.0부터 배제되었다고 경고하고 있으므로 Perl 스타일의 정규 표현식에 대해 강의하겠다.

POSIX 스타일의 정규 표현식을 확인하고 싶으면 PHP 매뉴얼을 참고하자.
 - POSIX 스타일 : http://docs.php.net/manual/kr/ref.regex.php
 - Perl 스타일 : http://docs.php.net/manual/kr/ref.pcre.php

들어가기 전에

아래는 정규표현식에서 사용되는 특수문자와 패턴이다. 최소한 아래 내용을 숙지하고 이 장을 공부해야 한다.
(마침표(.)가 잘 안보일수 있기 때문에 마침표만 작은 따옴표로 감싸 표현했다.)

'.', [a-zA-z], [aeiou], [^a-z], *, +, (group), \d{2, 4}, ^, $, |, ?

 

문자열 찾기 : preg_match()

int preg_match(string $pattern, string $subject[, array &$matches[, int $flags[, int $offset]]])

subject에 pattern을 매칭시켜 그 결과값을 matches에 배열로 저장한다.

flags에 PREG_OFFSET_CAPTURE를 넘겨주면 "[0]->매칭된 문자열", "[1]->매칭된 문자열 시작 위치"를 갖는 배열로 반환한다. 이 배열은 matches의 [0]요소로 대입된다.(2차원 배열이 된다.)

offset은 subject에서 시작할 문자열의 위치(인덱스)이다.

<?php
$subject = "abcdef";
$pattern = '/^def/';
?>

<?php
preg_match($pattern, $subject, $matches1, PREG_OFFSET_CAPTURE, 3);
preg_match($pattern, substr($subject,3), $matches2, PREG_OFFSET_CAPTURE);
preg_match($pattern, substr($subject,3), $matches3);
print_r($matches1);
print_r($matches2);
print_r($matches3);
?>

/*  실행결과
    $matches1 : Array ( )   // ^라는 특수기호 때문에 매칭되지 않는다.
    $matches2 : Array (
                    [0] => Array
                        (   [0] => def
                            [1] => 0
                        )
                )           // 2차원 배열로 반환한다.
    $matches3 : Array ( [0] => def )
*/
리턴 값으로 0, 1, FALSE를 갖는다. 이 함수는 매칭된 횟수를 리턴하는데 1번만 매칭시키기 때문에 0 또는 1이라는 값을 갖고, 오류가 날 경우에는 FALSE를 반환한다.
대소문자 무시
<?php
// 패턴 구분자 뒤의 "i"는 대소문자를 구별하지 않게 합니다.
if (preg_match("/php/i", "PHP is the web scripting language of choice.")) {
    echo "발견하였습니다."; // 실행
} else {
    echo "발견하지 못했습니다.";
}
?>

예제 더보기 : http://docs.php.net/manual/kr/function.preg-match.php
preg_match_all() : http://docs.php.net/manual/kr/function.preg-match-all.php

 

문자열 교체하기 : preg_replace()

mixed preg_replace(mixed $pattern, mixed $replacement, mixed $subject[, int $limit=-1[, int &$count]])

subject에서 pattern에 매칭되는 문자열을 replacement로 바꾼다. 이 때, limit으로 개수를 제한할 수 있고 count에 바뀐 횟수를 저장할 수 있다.(limit의 기본값은 -1로 무제한을 의미한다.)

예제 더보기 : http://docs.php.net/manual/kr/function.preg-replace.php

 

문자열 분리하기 : preg_split()

array preg_split(string $pattern, string $subject[,int $limit[, int $flags]])

subject를 pattern에 따라 분리해 배열로 반환한다. flags의 사용법은 생각보다 복잡하다. 아래 링크에서 확인하자.

예제 더보기 : http://docs.php.net/manual/kr/function.preg-split.php

댓글

댓글 본문
  1. Lee ju ho
    오! 이해가 되네여!
  2. Jeen-Woo Choi
    감사합니다~~