제 강좌를 출처를 밝히고 외부로 퍼가는 것은 허용하지만,
다른 강좌의 자료나 책의 자료로 사용되거나 부분적인 인용은 허용하지 않습니다.
PCRE 는 preg_ 로 시작되는 내장함수와 함께 사용되어지는 정규표현식을 말합니다.
PCRE > 정규표현식 의 핵심. 의미있는 메타 문자들 마지막
이전 내용에서는 정규표현식의 메타문자인 {최소값,최대값}, [문자문자문자......], [문자-문자], [^문자문자문자......] 에 대해서 알아보았습니다.
이번 내용에서도 역시 정규표현식의 핵심이라고 볼수 있는 의미 있는 메타 문자에 대해서 이어서 알아보도록 하겠습니다.
11. 문자열|문자열|문자열 ......
이것은 하나의 문자열에 대하여 매치 하고자 하는 모든 경우의 문자열을 지정 합니다.
[문자문자문자......] 와 같이 사용되는 문자클래스는 하나의 문자 에 대한 것 이고
문자열|문자열|문자열 ...... 와 같이 사용되는 것은 하나의 문자열에 대한 것 입니다.
예제15> test15.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 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
$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;
}
}
?>
결과 :
--> #<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
$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;
}
}
?>
결과 :
--> #<[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]># 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.
(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
말씀 하신데로
정규표현식은 거의 대부분의 언어와
시스템에서 지원되기 때문에 아주 유용합니다.
좋은 평가 감사합니다.
잘 배웠습니다. ^^
게시판 목록
프로그램
| 번호 | 제목 | 글쓴이 | 날짜 | 조회 |
|---|---|---|---|---|
| 6630 |
차가운바람
|
11년 전 | 1159 | |
| 6629 | 11년 전 | 1154 | ||
| 6628 |
put777
|
12년 전 | 640 | |
| 6627 |
|
12년 전 | 693 | |
| 6626 | 12년 전 | 1616 | ||
| 6625 |
|
12년 전 | 714 | |
| 6624 |
미켈란젤로의왼손
|
12년 전 | 476 | |
| 6623 |
|
12년 전 | 1040 | |
| 6622 | 12년 전 | 1375 | ||
| 6621 |
차가운바람
|
12년 전 | 628 | |
| 6620 | 12년 전 | 730 | ||
| 6619 |
|
12년 전 | 964 | |
| 6618 | 12년 전 | 1741 | ||
| 6617 | 12년 전 | 637 | ||
| 6616 |
차가운바람
|
12년 전 | 887 | |
| 6615 | 12년 전 | 2853 | ||
| 6614 | 12년 전 | 613 | ||
| 6613 |
강명구베드로
|
12년 전 | 526 | |
| 6612 |
|
12년 전 | 424 | |
| 6611 | 12년 전 | 1202 | ||
| 6610 | 12년 전 | 1019 | ||
| 6609 | 12년 전 | 3678 | ||
| 6608 |
|
12년 전 | 827 | |
| 6607 | 12년 전 | 690 | ||
| 6606 | 12년 전 | 565 | ||
| 6605 | 12년 전 | 450 | ||
| 6604 | 12년 전 | 969 | ||
| 6603 |
geektoo
|
12년 전 | 690 | |
| 6602 | 12년 전 | 834 | ||
| 6601 | 12년 전 | 358 | ||
| 6600 | 12년 전 | 400 | ||
| 6599 | 12년 전 | 535 | ||
| 6598 | 12년 전 | 935 | ||
| 6597 | 12년 전 | 927 | ||
| 6596 | 12년 전 | 409 | ||
| 6595 | 12년 전 | 780 | ||
| 6594 | 12년 전 | 4574 | ||
| 6593 | 12년 전 | 2578 | ||
| 6592 | 12년 전 | 826 | ||
| 6591 | 12년 전 | 581 | ||
| 6590 |
|
12년 전 | 1386 | |
| 6589 | 12년 전 | 756 | ||
| 6588 |
GINUSSOFT
|
12년 전 | 5125 | |
| 6587 | 12년 전 | 6207 | ||
| 6586 | 12년 전 | 1042 | ||
| 6585 | 12년 전 | 802 | ||
| 6584 | 12년 전 | 453 | ||
| 6583 |
|
12년 전 | 982 | |
| 6582 | 12년 전 | 866 | ||
| 6581 | 12년 전 | 839 | ||
| 6580 | 12년 전 | 615 | ||
| 6579 |
알랑가몰라
|
12년 전 | 919 | |
| 6578 | 12년 전 | 1326 | ||
| 6577 | 12년 전 | 1497 | ||
| 6576 |
경dragon
|
12년 전 | 763 | |
| 6575 | 12년 전 | 1877 | ||
| 6574 | 12년 전 | 678 | ||
| 6573 | 12년 전 | 975 | ||
| 6572 |
|
12년 전 | 1658 | |
| 6571 |
CTOMAN
|
12년 전 | 1953 | |
| 6570 | 12년 전 | 1725 | ||
| 6569 | 12년 전 | 1883 | ||
| 6568 | 12년 전 | 2401 | ||
| 6567 | 12년 전 | 1025 | ||
| 6566 |
lainfox
|
12년 전 | 1525 | |
| 6565 | 12년 전 | 3653 | ||
| 6564 |
제주프라이스
|
12년 전 | 1531 | |
| 6563 | 12년 전 | 1574 | ||
| 6562 |
프로프리랜서
|
12년 전 | 1344 | |
| 6561 |
프로프리랜서
|
12년 전 | 964 | |
| 6560 |
프로프리랜서
|
12년 전 | 1216 | |
| 6559 |
프로프리랜서
|
12년 전 | 1133 | |
| 6558 |
프로프리랜서
|
12년 전 | 1348 | |
| 6557 |
프로프리랜서
|
12년 전 | 1967 | |
| 6556 |
프로프리랜서
|
12년 전 | 1518 | |
| 6555 |
프로프리랜서
|
12년 전 | 1358 | |
| 6554 |
프로프리랜서
|
12년 전 | 3886 | |
| 6553 |
프로프리랜서
|
12년 전 | 1505 | |
| 6552 | 12년 전 | 841 | ||
| 6551 |
왕초보sasa
|
12년 전 | 1534 | |
| 6550 |
왕초보sasa
|
12년 전 | 628 | |
| 6549 |
왕초보sasa
|
12년 전 | 901 | |
| 6548 | 12년 전 | 1300 | ||
| 6547 | 12년 전 | 1187 | ||
| 6546 | 12년 전 | 5156 | ||
| 6545 | 12년 전 | 2514 | ||
| 6544 |
AnnieK
|
12년 전 | 1776 | |
| 6543 |
베르무트7
|
12년 전 | 624 | |
| 6542 |
오늘도망했다
|
12년 전 | 2231 | |
| 6541 | 12년 전 | 818 | ||
| 6540 | 12년 전 | 1129 | ||
| 6539 | 12년 전 | 846 | ||
| 6538 |
senseme
|
12년 전 | 3368 | |
| 6537 | 12년 전 | 777 | ||
| 6536 | 12년 전 | 3664 | ||
| 6535 | 12년 전 | 1345 | ||
| 6534 | 12년 전 | 1623 | ||
| 6533 | 12년 전 | 2242 | ||
| 6532 |
냐옹이사범
|
12년 전 | 2305 | |
| 6531 | 12년 전 | 565 |
댓글 작성
댓글을 작성하시려면 로그인이 필요합니다.
로그인하기