본문 바로가기
프로그래밍/PHP

[문법] PCRE 정규표현식 예제로 개념잡기.v3

by 백룡화검 2010. 4. 23.

PCRE 정규표현식 예제로 개념잡기.


http://kr2.php.net/manual/en/ref.pcre.php
http://kr2.php.net/manual/en/reference.pcre.pattern.syntax.php
http://kr2.php.net/manual/en/reference.pcre.pattern.modifiers.php

위 링크가 이해가 안되어도 스크롤을 천천히 내려가며 한번 읽어주고 본문을 읽어주세요.
본문에 없는건 묻지 마세요. 모릅니다.

pattern syntax

1. [0-9] 는 \d 로 표현하는것이 편리하다.
글 수정시에 글번호를 체크해 보자.
<?php
if(!isset($_POST['seq']) || !preg_match('/^[1-9]\d*$/', $_POST['seq'])) { // 시퀀스는 1부터 시작하므로 처음은 1-9 이다.
    header('HTTP/1.1 400');
    echo str_repeat('해킹은 사절<br />', 200);
    exit;
}
?>

2. ' '(공백)은 알아보기 쉽도록 \s 로 써주면 좋다.

3. \(백슬래시) 를 표현할때 버그인지 \\ 로 하면 안된다.
\\\ \\\\\ 이런식으로 홀수가 되는데 그냥 \x5c 로 hex 표현해주면 편하다.
4. (?) 로 매칭결과에 표현되지 않고 조건만 표현할 수 있다.
문자는 *나 + 등의 가변길이를 지원하지 않는다.
(?=문자) (?!문자) : 문자열 길이 계산에 반영되지 않고 조건만 검사한다.
<?php
$text = 'abcd';
echo preg_replace('/(?=b)./', 'e', $text); // 조건에 맞는곳에서 한글자 가져오기.
?>
aecd
(?<=문자) (?<!문자) : 문자열 길이 계산에 반영된다.
<?php
$text = 'abcd';
echo preg_replace('/(?<=b)./', 'e', $text); // 조건이 맞는곳 다음 한글자 가져오기.
?>
abed
따옴표로 감싼 문자열에 \ 가 있어도 정확하게 뽑아내 보자.
<?php
$text = <<<TEXT
<script type="text/javascript">
document.body.innerHTML += "<div style=\"font-size:12px; color:white; background-color:black;\">";
document.body.innerHTML += '\'예제 만들기 귀찮네...\'';
document.body.innerHTML += "</div>";
TEXT;
$cnt = preg_match_all('@(?<!\x5c)([\'"])(.*?)(?<!\x5c)\1@', $text, $matches);
print_r($matches[2]);
?>
Array
(
     [0] => text/javascript
     [1] => <div style=\"font-size:12px; color:white; background-color:black;\">
     [2] => \'예제 만들기 귀찮네...\'
     [3] => </div>
)
5. 줄바꿈이 \r\n 인지 \n 인지 비교하기 귀찮으므로 [\r\n]+ 혹은(\r?\n) 으로 표현하자.

6. UTF-8 을 사용한다면 /u modifier 에서 \x{ac00} 같은 표현이 가능해진다.
[\x{ac00}-\x{d7af}] 이렇게 쓰면 [가-