테스트 사이트 - 개발 중인 베타 버전입니다

정규표현식 의 핵심. 의미있는 메타 문자들 마지막

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

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

PCRE > 정규표현식 의 핵심. 의미있는 메타 문자들 마지막

이전 내용에서는 정규표현식의 메타문자인 {최소값,최대값}, [문자문자문자......], [문자-문자], [^문자문자문자......] 에 대해서 알아보았습니다.
이번 내용에서도 역시 정규표현식의 핵심이라고 볼수 있는 의미 있는 메타 문자에 대해서 이어서 알아보도록 하겠습니다.

11. 문자열|문자열|문자열 ......
이것은 하나의 문자열에 대하여 매치 하고자 하는 모든 경우의 문자열을 지정 합니다.
[문자문자문자......] 와 같이 사용되는 문자클래스는 하나의 문자 에 대한 것 이고
문자열|문자열|문자열 ...... 와 같이 사용되는 것은 하나의 문자열에 대한 것 입니다.

예제15> test15.php

<?php

$strings = Array();
$strings[] = 'This is Flower';
$strings[] = "This is lion";
$strings[] = "Are you teacher ?";
$strings[] = 'Yes I am Teacher';

foreach($strings as $string){

    if (preg_match('/flower|lion|teacher/', $string, $matches)) {

        echo '<font color="blue">' . $string . ' 은 /flower|lion|teacher/ 패턴에 매치되는 문자열을 포함한 문자열 입니다. --> ' . $matches[0] . '</font><br />' . PHP_EOL;
    }
    else {

        echo '<font color="red">' . $string . ' 은 /flower|lion|teacher/ 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.</font><br />' . PHP_EOL;
    }
}

echo '<br />' . PHP_EOL;

foreach($strings as $string){

    if (preg_match('/[fF]lower|[Ll]ion|[Tt]eacher/', $string, $matches)) {

        echo '<font color="blue">' . $string . ' 은 /[fF]lower|[Ll]ion|[Tt]eacher/ 패턴에 매치되는 문자열을 포함한 문자열 입니다. --> ' . $matches[0] . '</font><br />' . PHP_EOL;
    }
    else {

        echo '<font color="red">' . $string . ' 은 /[fF]lower|[Ll]ion|[Tt]eacher/ 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.</font><br />' . PHP_EOL;
    }
}

?>


결과 :

This is Flower 은 /flower|lion|teacher/ 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.
This is lion 은 /flower|lion|teacher/ 패턴에 매치되는 문자열을 포함한 문자열 입니다. --> lion
Are you teacher ? 은 /flower|lion|teacher/ 패턴에 매치되는 문자열을 포함한 문자열 입니다. --> teacher
Yes I am Teacher 은 /flower|lion|teacher/ 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.

This is Flower 은 /[fF]lower|[Ll]ion|[Tt]eacher/ 패턴에 매치되는 문자열을 포함한 문자열 입니다. --> Flower
This is lion 은 /[fF]lower|[Ll]ion|[Tt]eacher/ 패턴에 매치되는 문자열을 포함한 문자열 입니다. --> lion
Are you teacher ? 은 /[fF]lower|[Ll]ion|[Tt]eacher/ 패턴에 매치되는 문자열을 포함한 문자열 입니다. --> teacher
Yes I am Teacher 은 /[fF]lower|[Ll]ion|[Tt]eacher/ 패턴에 매치되는 문자열을 포함한 문자열 입니다. --> Teacher

위 예제 결과에서 보면,
윗 부분에서는 flower, lion, teacher 의 첫자가 소문자로 사용된것만 매치 되었다고 나오고
아래 부분에서는 flower, lion, teacher 의 첫자가 소문자, 대문자 상관없이 매치되었다고 나옵니다.

/flower|lion|teacher//[fF]lower|[Ll]ion|[Tt]eacher/ 의 차이는 첫글자를 소문자만 가능하도록 지정했느냐, 대소문자 모두 가능하도록 지정했느냐의 차이입니다.

문자열을 | 으로 연결 함 으로 인해서 flower 가 있거나 lion 이 있거나 teacher 가 있거나 셋중에 하나만 있으면 매치됨 을 알수 있습니다.



12. (패턴)
이것은 전체 패턴 내에서 하나의 작은 패턴을 지정 합니다.
일명, 서브패턴(보조패턴, 하부패턴)을 지정 하는 것입니다.

다음과 같이 크게 두가지 용도 로 사용됩니다.
preg_match 함수 에서 3번째 인자 $matches 와 함께 사용하여, () 묶여진 서브패턴과 매치되는 문자열을 배열로 따로 받고 싶을때
전체 패턴 만으로는 정확한 매치가 어려울 경우 서브패턴을 지정하여 정확한 매치를 하기 위해서 사용 합니다.

예제16> test16.php

<?php

$strings = Array();
$strings[] = "<li><a href='../bbs/logout.php'>로그아웃</a></li>";
$strings[] = "<li><A HREF='../bbs/current_connect.php'>현재접속자</a></li>";
$strings[] = "<li><a href='../bbs/new.php'>전체게시물</a></li>";
$strings[] = "<li id='ol_after_icon'><img src='../data/member/db/dbckdghk.gif' alt='' /></li>";

foreach($strings as $string){

    //문자열에서 a 태그를 찾고, 그 A태그의 href 값과 링크대상 문자열을 가져온다.
    if (preg_match("#<a href='([^']+)'>([^<]+)</a>#", $string, $matches)) {

        echo '<font color="blue">' . htmlspecialchars($string) . " 은 패턴에 매치되는 문자열을 포함한 문자열 입니다.<br /> --> " . htmlspecialchars("#<a href='([^']+)'>([^<]+)</a>#") . " 전체 패턴에 일치하는 문자열 : " . htmlspecialchars($matches[0]) . "<br /> --> ([^']+) 첫번째 서브 패턴에 일치하는 문자열 : " . $matches[1] . "<br /> --> ([^<]+) 두번째 서브 패턴에 일치하는 문자열 : " . $matches[2] . "</font><br /><br />" . PHP_EOL;
    }
    else {

        echo '<font color="red">' . htmlspecialchars($string) . " 은 " . htmlspecialchars("#<a href='([^']+)'>([^<]+)</a>#") . " 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.</font><br /><br />" . PHP_EOL;
    }
}

echo '<br />' . PHP_EOL;

foreach($strings as $string){

    //문자열에서 a 태그를 찾고, 그 A태그의 href 값과 링크대상 문자열을 가져온다. 대소문자도 구분없이 가져온다. 패턴변경자는 아직 안배웟으므로 생략
    if (preg_match("#<[aA] (href|HREF)='([^']+)'>([^<]+)</[aA]>#", $string, $matches)) {

        echo '<font color="blue">' . htmlspecialchars($string) . " 은 패턴에 매치되는 문자열을 포함한 문자열 입니다.<br /> --> " . htmlspecialchars("#<[aA] (href|HREF)='([^']+)'>([^<]+)</[aA]>#") . " 전체 패턴에 일치하는 문자열 : " . htmlspecialchars($matches[0]) . "<br /> --> (href|HREF) 첫번째 서브 패턴에 일치하는 문자열 : " . $matches[1] . "<br /> --> ([^']+) 두번째 서브 패턴에 일치하는 문자열 : " . $matches[2] . "<br /> --> ([^<]+) 세번째 서브 패턴에 일치하는 문자열 : " . $matches[3] . "</font><br /><br />" . PHP_EOL;
    }
    else {

        echo '<font color="red">' . htmlspecialchars($string) . " 은 " . htmlspecialchars("#<[aA] (href|HREF)='([^']+)'>([^<]+)</[aA]>#") . " 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.</font><br /><br />" . PHP_EOL;
    }
}

?>


결과 :

<li><a href='../bbs/logout.php'>로그아웃</a></li> 은 패턴에 매치되는 문자열을 포함한 문자열 입니다.
--> #<a href='([^']+)'>([^<]+)</a># 전체 패턴에 일치하는 문자열 : <a href='../bbs/logout.php'>로그아웃</a>
--> ([^']+) 첫번째 서브 패턴에 일치하는 문자열 : ../bbs/logout.php
--> ([^<]+) 두번째 서브 패턴에 일치하는 문자열 : 로그아웃


<li><A HREF='../bbs/current_connect.php'>현재접속자</a></li> 은 #<a href='([^']+)'>([^<]+)</a># 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.

<li><a href='../bbs/new.php'>전체게시물</a></li> 은 패턴에 매치되는 문자열을 포함한 문자열 입니다.
--> #<a href='([^']+)'>([^<]+)</a># 전체 패턴에 일치하는 문자열 : <a href='../bbs/new.php'>전체게시물</a>
--> ([^']+) 첫번째 서브 패턴에 일치하는 문자열 : ../bbs/new.php
--> ([^<]+) 두번째 서브 패턴에 일치하는 문자열 : 전체게시물


<li id='ol_after_icon'><img src='../data/member/db/dbckdghk.gif' alt='' /></li> 은 #<a href='([^']+)'>([^<]+)</a># 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.


<li><a href='../bbs/logout.php'>로그아웃</a></li> 은 패턴에 매치되는 문자열을 포함한 문자열 입니다.
--> #<[aA] (href|HREF)='([^']+)'>([^<]+)</[aA]># 전체 패턴에 일치하는 문자열 : <a href='../bbs/logout.php'>로그아웃</a>
--> (href|HREF) 첫번째 서브 패턴에 일치하는 문자열 : href
--> ([^']+) 두번째 서브 패턴에 일치하는 문자열 : ../bbs/logout.php
--> ([^<]+) 세번째 서브 패턴에 일치하는 문자열 : 로그아웃


<li><A HREF='../bbs/current_connect.php'>현재접속자</a></li> 은 패턴에 매치되는 문자열을 포함한 문자열 입니다.
--> #<[aA] (href|HREF)='([^']+)'>([^<]+)</[aA]># 전체 패턴에 일치하는 문자열 : <A HREF='../bbs/current_connect.php'>현재접속자</a>
--> (href|HREF) 첫번째 서브 패턴에 일치하는 문자열 : HREF
--> ([^']+) 두번째 서브 패턴에 일치하는 문자열 : ../bbs/current_connect.php
--> ([^<]+) 세번째 서브 패턴에 일치하는 문자열 : 현재접속자


<li><a href='../bbs/new.php'>전체게시물</a></li> 은 패턴에 매치되는 문자열을 포함한 문자열 입니다.
--> #<[aA] (href|HREF)='([^']+)'>([^<]+)</[aA]># 전체 패턴에 일치하는 문자열 : <a href='../bbs/new.php'>전체게시물</a>
--> (href|HREF) 첫번째 서브 패턴에 일치하는 문자열 : href
--> ([^']+) 두번째 서브 패턴에 일치하는 문자열 : ../bbs/new.php
--> ([^<]+) 세번째 서브 패턴에 일치하는 문자열 : 전체게시물


<li id='ol_after_icon'><img src='../data/member/db/dbckdghk.gif' alt='' /></li> 은 #<[aA] (href|HREF)='([^']+)'>([^<]+)</[aA]># 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.


위 예제에서
#<a href='([^']+)'>([^<]+)</a># 와 #<[aA] (href|HREF)='([^']+)'>([^<]+)</[aA]># 의 차이점은
첫번째, a태그를 열고 닫을때 a 도 가능하게 하고 A도 가능하게 처리한것입니다.
두번째, href 를 href 와 HREF 모든 가능하게 한 것 입니다.

결과 출력시 htmlspecialchars 를 쓴것은 출력될 문자열이 태그이기 때문에, 태그 그대로로 출력하기 위해서 사용하였습니다.



13. (?:패턴)
이것은 위해서 설명한 (패턴) 의 추가적인 기능입니다.
(다음에 ?: 를 이어서 씀으로서 이 서브패턴은 배열로서 결과값을 받지 않겠다 라는 뜻입니다.
즉, 전체 패턴 내에서 서브 패턴으로서의 기능은 하지만, 결과값 배열에는 포함되지 않는다 라는 뜻입니다.

예제17> test17.php

<?php

$strings = Array();
$strings[] = "<li><a href='../bbs/logout.php'>로그아웃</a></li>";
$strings[] = "<li><A HREF='../bbs/current_connect.php'>현재접속자</a></li>";
$strings[] = "<li><a href='../bbs/new.php'>전체게시물</a></li>";
$strings[] = "<li id='ol_after_icon'><img src='../data/member/db/dbckdghk.gif' alt='' /></li>";

foreach($strings as $string){

    //문자열에서 a 태그를 찾고, 그 A태그의 href 값과 링크대상 문자열을 가져온다. 대소문자도 구분없이 가져온다. 패턴변경자는 아직 안배웟으므로 생략
    if (preg_match("#<[aA] (?:href|HREF)='([^']+)'>([^<]+)</[aA]>#", $string, $matches)) {

        echo '<font color="blue">' . htmlspecialchars($string) . " 은 패턴에 매치되는 문자열을 포함한 문자열 입니다.<br /> --> " . htmlspecialchars("#<[aA] (?:href|HREF)='([^']+)'>([^<]+)</[aA]>#") . " 전체 패턴에 일치하는 문자열 : " . htmlspecialchars($matches[0]) . "<br /> --> ([^']+) 첫번째 서브 패턴에 일치하는 문자열 : " . $matches[1] . "<br /> --> ([^<]+) 두번째 서브 패턴에 일치하는 문자열 : " . $matches[2] . "</font><br /><br />" . PHP_EOL;
    }
    else {

        echo '<font color="red">' . htmlspecialchars($string) . " 은 " . htmlspecialchars("#<[aA] (?:href|HREF)='([^']+)'>([^<]+)</[aA]>#") . " 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.</font><br /><br />" . PHP_EOL;
    }
}

?>


결과 :

<li><a href='../bbs/logout.php'>로그아웃</a></li> 은 패턴에 매치되는 문자열을 포함한 문자열 입니다.
--> #<[aA] (?:href|HREF)='([^']+)'>([^<]+)</[aA]># 전체 패턴에 일치하는 문자열 : <a href='../bbs/logout.php'>로그아웃</a>
--> ([^']+) 첫번째 서브 패턴에 일치하는 문자열 : ../bbs/logout.php
--> ([^<]+) 두번째 서브 패턴에 일치하는 문자열 : 로그아웃

<li><A HREF='../bbs/current_connect.php'>현재접속자</a></li> 은 패턴에 매치되는 문자열을 포함한 문자열 입니다.
--> #<[aA] (?:href|HREF)='([^']+)'>([^<]+)</[aA]># 전체 패턴에 일치하는 문자열 : <A HREF='../bbs/current_connect.php'>현재접속자</a>
--> ([^']+) 첫번째 서브 패턴에 일치하는 문자열 : ../bbs/current_connect.php
--> ([^<]+) 두번째 서브 패턴에 일치하는 문자열 : 현재접속자

<li><a href='../bbs/new.php'>전체게시물</a></li> 은 패턴에 매치되는 문자열을 포함한 문자열 입니다.
--> #<[aA] (?:href|HREF)='([^']+)'>([^<]+)</[aA]># 전체 패턴에 일치하는 문자열 : <a href='../bbs/new.php'>전체게시물</a>
--> ([^']+) 첫번째 서브 패턴에 일치하는 문자열 : ../bbs/new.php
--> ([^<]+) 두번째 서브 패턴에 일치하는 문자열 : 전체게시물

<li id='ol_after_icon'><img src='../data/member/db/dbckdghk.gif' alt='' /></li> 은 #<[aA] (?:href|HREF)='([^']+)'>([^<]+)</[aA]># 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.


※ 16번 예제의 결과와 비교했을때 17번 예제에는 $matches[3] 이 없는 것을 알수 있습니다.
(href|HREF) 에서 (?:href|HREF) 로 바꿔줌 으로 해서, 매치시에는 필요하지만 프로그램 상에서는 필요없는 부분을 배열로 받지 않았습니다.

이상으로서 메타문자에 대한 내용은 마칩니다.

서브패턴 관련해서 더 다뤄야 할 내용이 있지만, 현재 진행하기에는 적합하지 않아서 추후에 따로 더 내용을 한번 더 다룰까 합니다.

다음 강에서는 역시 정규표현식에서의 핵심인 패턴변경자에 대해서 다뤄보도록 하겠습니다.

댓글 작성

댓글을 작성하시려면 로그인이 필요합니다.

로그인하기

댓글 16개

이런 거 가르쳐주는 곳이 없어서 못 배웠는데 이제야 궁금증이 해소되네요. 정말 감사합니다
다음 강좌가 기대되네요ㅎㅎ
네에 감사합니다.
좋은 강좌네요.

특히 '문자열|문자열|문자열'에 사용되는 '|'메타 문자는 or 검색용으로 정말 사용할 때가 많죠.

PHP 가 아니더라도 grep, editplus 등등...


예를 들어 리눅스에서 프로세스 정보중 apache, mysql 만 보고 싶은 경우 등에 사용 가능하죠.
ps -ef|grep -P 'httpd|mysqld'


grep --help
-P, --perl-regexp PATTERN is a Perl regular expression
네 감사합니다.

말씀 하신데로
정규표현식은 거의 대부분의 언어와
시스템에서 지원되기 때문에 아주 유용합니다.

좋은 평가 감사합니다.
12년 전
서브패턴도 꽤 유용하겠네요...
잘 배웠습니다. ^^
강좌 잘 봤습니다. 감사합니다.

게시글 목록

번호 제목
535
534
533
522
521
520
517
516
511
508
507
500
493
490
486
463
461
444
435
334
304
290
244
233
218
217
194
185
181
156