정규표현식 관련 내장함수 preg_match > 개발강좌

개발강좌

프로그램 강좌 :
1. 유창화님의 썸네일, 정규표현식, 이미지관련 강좌
2. Sphinx 검색엔진을 이용한 도로명 주소 검색 시스템 구축

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

정규표현식 정규표현식 관련 내장함수 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
)

추천
6

댓글 16개

저는 장사를 하려 해요. 문제는 레이아웃 판매를 꿈꾸고 있습니다.
다른 장사 같으면 지식보다는 얼마나 열심히 자리에 붙어 앉아
응대를 해 드렸냐에 따라서 결과가 좋게 나오는데요.
프로그램을 다루려 하니 이것이 이런 자세만으로는
통하지 않을 것 같아서 공부하고 있습니다.
고객의 질의에 만족스러운 답변만 드려도 승산은 아주 크거든요.
수많은 분께 이롭고자 귀중한 선생님 시간을 이미 오래전에도 쏟으셨는데
이것을 꼼꼼히 살펴보게 된 것은 "이제야" 입니다.
모든 것이 때가 있구나 새삼 더 느낍니다.
누군가는 저처럼 수많은 시간이 지난 후,
고맙습니다! 또 할 것 같은데요.
소중한 시간을 참 가치 있게 쓰셨습니다. ㅡㅡ.
부럽고, 존경스럽습니다. 존경이 딱 맞을 것 같아요.
고맙습니다!
전체 103
개발강좌 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT