유

정규표현식 관련 내장함수 preg_match

대단할것은 없는 강좌이지만,
제 강좌를 출처를 밝히고 외부로 퍼가는 것은 허용하지만,
다른 강좌의 자료나 책의 자료로 사용되거나 부분적인 인용은 허용하지 않습니다.

강좌는 php 5. 대를 기준으로 하며, PCRE (펄과 호환 되는 정규표현식)을 다룹니다.
PCRE 는 preg_ 로 시작되는 내장함수와 함께 사용되어지는 정규표현식을 말합니다.

PCRE > 정규표현식 관련 내장함수 preg_match

정규표현식을 사용하기 위해서는,
php에서 기본적으로 제공하는 정규표현식을 지원하는 내장함수에 대해서 이해와 숙지가 필요합니다.
그중 가장 많이 쓰이는 것이 preg_match 입니다.
해당 함수에 대해서 설명하지 않고서는 앞으로의 예제 진행이 어려울 것 같아 먼저 다룹니다.

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

설명 : 입력받은 문자열(string $subject)에 입력받은 정규표현식 패턴(string $pattern)과 일치되는 문자열이 존재하는지 판단합니다.

인자 :
    -> string $pattern :
        문자열로 된 정규 표현식 패턴
        ("[구분자]표현식[구분자][변경자]" 또는 '[구분자]표현식[구분자][변경자]')
    -> string $subject : 전체 대상 문자열
    -> array &$matches : 패턴과 일치하는 문자열을 저장할 배열
    -> int $flags, int $offset : 현재 단계에서는 설명을 제외했습니다.

결과값 :
    패턴과 매치되는 문자열을 찾았을 때는 1 을 반환, 못 찾았을 때는 false 를 반환.
    단, 세번째 인자(배열, Array)가 존재할 경우, 매치되는 문자열이 해당 배열 변수의 0번째에 할당되어 반환

용도 :
    특정 패턴의 문자열이 존재하는지 여부를 확인 할때나,
    특정 패턴의 문자열을 찾아서 그 문자열을 받고 싶을때 사용합니다

※ 메뉴얼에서 함수를 정의할때 [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] 같이
[] 으로 둘러 쌓여 있는 경우가 있습니다.
이것은 사용시 반드시 필요한 인자가 아니라 생략 가능한 인자라는 뜻 입니다.

보통 사용자 함수를 만들때 보면,
function get_title ($title, $len=50) {.....}
이런식으로 쓰는 경우가 많습니다.

이 함수는 사용할때 get_title ($title); 로도 사용할수 있고, get_title($title, $len); 로도 사용할수 있는 것과 같은 이치입니다.

※ &$matches 와 같이 변수 앞에 & 가 붙는 경우는 $matches 변수를 함수 내부에서 참조를 하겠다는 뜻입니다.
preg_match 에서의 $matches 에 대한 참조는 크게 의미가 없으므로, 참조에 대해서는 차후에 강좌나 내용에서 설명하도록 하겠습니다.


정규표현식에서 정규(화)라는 말의 뜻 은
어떤 문자열에 대해서 고정된 규칙이 있는 것을 사람이 보기에 짧고 보기좋게 정의하고 규정 한것입니다.
말그대로 정규화는 짧고 보기좋게 정의한 것 이지, 정규화 하지 않았다고 프로그램의 성능이 크게 저하되거나, 동작하지 않는 것은 아닙니다.

예를 들면 표현식에서

1. 알파벳 소문자 중 어느 한문자를 표현하세요. 라고 할때
정규화를 시키지 않은 상태라면 /[abcdefghijklmnopqrstuvwxyz]/
이것은 /[a-z]/ 와 같이 간단하게 표현 할수 있습니다.

2. 알파벳 대소문자 중 어느 한문자를 표현하세요. 라고 할때
정규화를 시키지 않은 상태라면 /[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ]/
이것은 /[a-zA-z]/ 또는 /[a-z]/i 와 같이 간단하게 표현 할수 있습니다.

3. 알파벳 소문자 중 어느 세문자를 표현하세요. 라고 할때
정규화를 시키지 않은 상태라면 /[abcdefghijklmnopqrstuvwxyz][abcdefghijklmnopqrstuvwxyz][abcdefghijklmnopqrstuvwxyz]/
이것은 /[a-z]{3}/ 와 같이 간단하게 표현 할수 있습니다.

4. 알파벳 소문자 중 어느 세문자나 네문자를 표현하세요. 라고 할때
정규화를 시키지 않은 상태라면 ...... (| 를 사용하여 표현할수는 있지만, 너무 긴 관계로 생략합니다.)
이것은 /[a-z]{3,4}/ 와 같이 간단하게 표현 할수 있습니다.

※ 정규표현식에서 [문자열] 의 의미는 [] 안에 포함된 문자중 어느 한문자 를 뜻합니다.
[] 내의 - 은 양옆 문자사이의 모든 문자의 범위 를 뜻합니다. 즉 [a-z] 는 [abcdefghijklmnopqrstuvwxyz] 와 동일한 표현입니다.

{숫자,숫자} 는 바로 전의 문자가 몇번 반복 하느냐 입니다.
앞의 숫자는 최소값, 뒤의 숫자는 최대값, 뒤의 숫자는 생략가능합니다. 생략시에는 앞의 숫자가 최소값 도 되고 최대값도 됩니다.


preg_match 의 용도는 위에서 설명했다시피 크게 두가지 입니다.

1. 입력받은 정규식 패턴과 일치하는 문자열의 존재 여부 확인
2. 입력받은 정규식 패턴과 일치하는 문자열을 배열로 반환


아래의 예제는 입력받은 URL 에서 제일 앞에 http:// 나 https:// 가 존재하는지 확인하는 것입니다.
이해를 돕기위해 여러가지 경우의 URL 을 동시에 체크하도록 만들어 보았습니다.

예제3> test3.php

<?php

$urls = Array();
$urls[] = 'http://apmusers.com/';
$urls[] = 'https://apmusers.com/';
$urls[] = 'HTTP://APMUSERS.COM/';
$urls[] = 'ahttp://apmusers.com/';//http:// 앞에 다른 문자가 있다.
$urls[] = 'b http://apmusers.com/';//htpp:// 앞에 다른 문자와 공백이 있다.
$urls[] = 'http:/apmusers.com/'; //http:/ 다음에 / 하나 없다

foreach($urls as $url){

    echo $url . ' ==> ';

    //url 의 제일 앞에 대소문자 구분없이 http:// 나 https:// 가 존재하는지 확인
    if (preg_match("`^https?://`i", $url)) {

        echo "<font color='blue'>제일 앞에 http(s):// 가 있는 사용 가능한 URL 입니다.</font> <br />" . PHP_EOL;
    }
    else {

        echo "<font color='red'>제일 앞에 http(s):// 가 없는 사용 불가능한 URL 입니다.</font> <br />" . PHP_EOL;
    }
}

?>


결과 :

http://apmusers.com/ ==> 맨앞에 http(s):// 가 있는 사용 가능한 URL 입니다.
https://apmusers.com/ ==> 맨앞에 http(s):// 가 있는 사용 가능한 URL 입니다.
HTTP://APMUSERS.COM/ ==> 맨앞에 http(s):// 가 있는 사용 가능한 URL 입니다.
ahttp://apmusers.com/ ==> 맨앞에 http(s):// 가 없는 사용 불가능한 URL 입니다.
b http://apmusers.com/ ==> 맨앞에 http(s):// 가 없는 사용 불가능한 URL 입니다.
http:/apmusers.com/ ==> 맨앞에 http(s):// 가 없는 사용 불가능한 URL 입니다.



아래의 예제는 입력받은 HTML 에서 첫번째 매치되는 이미지 태그의 src 를 뽑는 것입니다.
원래는 여러 다양한 케이스에 대비해 만들어야 하지만, 현재 단계에서는 이해를 돕는 차원에서 최대한 간단하게 만들었습니다.

예제4> test4.php

<?php

$html = "
<div id='rw_banner'>
<a href='http://design.sir.co.kr/event/coupon.htm' target='_blank'><img src='./img/ad/rw_designmall.png' alt='SIR 디자인몰 바로가기' /></a>
<a href='./bbs/board.php?bo_table=pb_lecture&sca=%EB%B0%98%EC%9D%91%ED%98%95%EC%9B%B9'><img src='./img/ad/rw_responsive.png' alt='SIR 반응형웹 강좌' /></a>
<a href='./bbs/board.php?bo_table=ds_lecture'><img src='./img/ad/rw_multimedia.png' alt='SIR 드로잉 강좌' /></a>
<a href='./bbs/board.php?bo_table=pg_lecture'><img src='./img/ad/rw_phpych.png' alt='SIR PHP 강좌' /></a>
<!-- <a href='http://solution.sir.co.kr' target='_blank'><img src='./img/ad/rw_solutionmall.png' alt='SIR 솔루션몰 바로가기' /></a>
<a href='http://homepage.sir.co.kr' target='_blank'><img src='./img/ad/rw_homepagemall.png' alt='SIR 홈페이지몰 바로가기' /></a> -->
</div>
";

preg_match("`<img\s+src='([^']+)'`", $html, $matches);

print_r($matches);

?>


결과 :

Array
(
    [0] => <img src='./img/ad/rw_designmall.png'
    [1] => ./img/ad/rw_designmall.png
)

|

댓글 16개

잘 읽었습니당.
넵 감사합니다.
예제까지 친절한 설명 감사드립니다....^^
감사합니다~~
고맙습니다.~~
언제쯤이면 안개가 걷친것 처럼 확실하게 잡힐까요?
좋은 강좌 감사합니다.
ㅎㅎ 네.. 곧 그렇게 되지 않으실까요.
감사합니다.
와 대박 쏙쏙 들어오네요 좋은 강좌 정말 감사합니다!
네에 고맙습니다.
강좌 고맙습니다.
저는 장사를 하려 해요. 문제는 레이아웃 판매를 꿈꾸고 있습니다.
다른 장사 같으면 지식보다는 얼마나 열심히 자리에 붙어 앉아
응대를 해 드렸냐에 따라서 결과가 좋게 나오는데요.
프로그램을 다루려 하니 이것이 이런 자세만으로는
통하지 않을 것 같아서 공부하고 있습니다.
고객의 질의에 만족스러운 답변만 드려도 승산은 아주 크거든요.
수많은 분께 이롭고자 귀중한 선생님 시간을 이미 오래전에도 쏟으셨는데
이것을 꼼꼼히 살펴보게 된 것은 "이제야" 입니다.
모든 것이 때가 있구나 새삼 더 느낍니다.
누군가는 저처럼 수많은 시간이 지난 후,
고맙습니다! 또 할 것 같은데요.
소중한 시간을 참 가치 있게 쓰셨습니다. ㅡㅡ.
부럽고, 존경스럽습니다. 존경이 딱 맞을 것 같아요.
고맙습니다!
좋은 강좌네요 잘 보고 이해하고있습니다
감사합니다 ㅎㅎㅎ
댓글을 작성하시려면 로그인이 필요합니다.

프로그램

8,188건
+
제목 글쓴이 날짜 조회
13-03-03 조회 6,240
13-03-01 조회 5,570
13-03-01 조회 8,312
13-03-01 조회 6,308
13-02-26 조회 3,918
13-02-26 조회 3,861
13-02-26 조회 4,759
13-02-24 조회 8,171
13-02-24 조회 4,258
13-02-24 조회 3,500
13-02-24 조회 5,315
13-02-24 조회 5,308
13-02-24 조회 4,375
13-02-24 조회 5,712
13-02-24 조회 9,400
13-02-14 조회 5,107
13-02-13 조회 9,036
13-01-29 조회 7,678
13-01-24 조회 5,027
13-01-24 조회 4,902
13-01-17 조회 4,313
13-01-16 조회 4,345
13-01-08 조회 4,396
12-12-27 조회 4,059
12-12-20 조회 1.1만
12-12-20 조회 3,381
12-12-06 조회 4,369
12-12-01 조회 4,131
12-11-28 조회 5,698
12-11-25 조회 5,404
12-10-20 조회 4,664
12-10-03 조회 4,831
12-09-26 조회 4,991
12-09-15 조회 8,443
12-09-14 조회 5,458
12-09-11 조회 3,962
12-09-10 조회 3,978
12-09-05 조회 8,859
12-08-29 조회 4,660
12-08-26 조회 3,788
12-08-23 조회 3,489
12-08-22 조회 3,574
12-08-22 조회 4,388
12-08-21 조회 3,536
12-08-20 조회 3,455
12-08-20 조회 9,258
12-08-15 조회 4,377
12-08-13 조회 3,295
12-08-11 조회 4,718
12-08-05 조회 4,562
12-08-03 조회 3,345
12-08-03 조회 4,041
12-08-02 조회 5,023
12-07-29 조회 4,131
12-07-26 조회 3,708
12-07-26 조회 3,578
12-07-22 조회 3,489
12-07-20 조회 3,323
12-07-19 조회 4,187
12-07-19 조회 3,442
12-07-16 조회 3,563
12-07-16 조회 4,484
12-07-15 조회 3,559
12-07-12 조회 7,389
12-07-12 조회 5,030
12-07-11 조회 3,076
12-07-09 조회 3,238
12-07-05 조회 3,850
12-07-04 조회 4,422
12-07-04 조회 3,827
12-07-04 조회 4,349
12-06-29 조회 3,813
12-06-27 조회 3,402
12-06-24 조회 3,880
12-06-22 조회 4,189
12-06-22 조회 8,600
12-06-22 조회 3,251
12-06-21 조회 3,285
12-06-17 조회 3,908
12-06-14 조회 4,011
12-06-14 조회 3,294
12-06-08 조회 4,440
12-06-06 조회 3,403
12-06-04 조회 4,159
12-05-26 조회 4,977
12-05-26 조회 3,932
12-05-25 조회 3,228
12-05-24 조회 3,330
12-05-22 조회 3,375
12-05-20 조회 3,002
12-05-16 조회 3,138
12-05-15 조회 3,532
12-05-10 조회 3,963
12-05-08 조회 3,486
12-05-04 조회 3,339
12-05-03 조회 4,294
12-05-02 조회 3,429
12-05-02 조회 3,204
12-05-02 조회 3,301
12-04-26 조회 3,450