패턴 문법패턴 문법 -- PCRE 정규표현식 문법 설명 설명PCRE 라이브러리는 아주 약간의 차이(아래를 참고)를 제외하고, 펄 5와 동일한 구문과 의미를 사용하여 정규표현식 패턴 매칭을 수행하는 함수의 집합입니다. 현재 수행은 펄 5.005에 대응합니다. 펄과의 차이여기에서 설명한 차이는 펄 5.005 기준입니다. PCRE는 다른 문자 집합으로 컴파일할 수 있지만, 기본적으로 공백 문자는 C 라이브러리 함수 isspace()가 인식하는 모든 문자입니다. 보통 isspace()는 스페이스, 폼피드, 줄바꿈, 캐리지 리턴, 수평 탭, 수직 탭을 인식합니다. 펄 5는 공백 문자에 수직 탭을 포함하지 않습니다. 오랜 기간동안 펄 문서의 \v 이스케이프는 사실상 인정되지 않았습니다. 그러나 문자 자체는 적어도 5.002까지 공백으로 취급되었으며, 5.004와 5.005는 \s에서 인식하지 않습니다. PCRE는 lookahead 단정에서 반복 횟수를 허용하지 않습니다. 펄은 허용하지만, 생각하는 그대로의 의미를 갖지 않습니다. 예를 들어, (?!a){3}는 다음 세 문자가 "a"가 아닌 것을 의미하지 않습니다. 단지, 다음 문자가 "a"가 아니라는 것을 세번 확인할 뿐입니다. 부정 lookahead 단정 안에서 일어나는 서브패턴 검출을 카운트를 하지만, 시작 위치 벡터에 그 엔트리를 설정하지는 않습니다. 펄은 부정 lookahead 단정이 단 하나의 브랜치를 가지고 있을 경우에 한하여, 그 단정이 매치에 실패(결과적으로 성공)하기 전에 매치한 어떠한 패턴에 대해서만 그에 대한 숫자 변수를 설정합니다. 바이너리 제로 문자는 목표 문자열에서는 지원하지만, 패턴 문자열에서는 허용하지 않습니다. 패턴은 제로로 종료하는 보통의 C 문자열로 처리하기 때문입니다. 패턴에서 바이너리 제로를 표현하기 위해서는 이스케이프 시퀀스 "\\x00"로 사용할 수 있습니다. 다음의 펄 이스케이프 시퀀스는 지원하지 않습니다: \l, \u, \L, \U, \E, \Q. 사실, 이들은 펄의 일반 문자열 핸들링이며, 패턴 매칭 엔진의 부분이 아닙니다. 펄의 \G는 싱글 패턴 매치에 적절하지 않기 때문에 지원하지 않습니다. 당연하게도, PCRE는 (?{code}) 구조를 지원하지 않습니다. 패턴의 일부가 반복될 때, 잡아낸 문자열의 설정에 관해서, 펄 5.005_02에서 일부 이상한 동작이 존재합니다. 예를 들어, "aba"에 대해서 패턴 /^(a(b)?)+$/를 매칭하면 $2를 "b" 값으로 설정하지만, "aabbaa"에 대해서 /^(aa(bb)?)+$/를 매칭하면 $2를 설정하지 않습니다. 하지만 패턴을 /^(aa(b(b))?)+$/로 변경하면 $2(와 $3)를 설정합니다. 펄 5.004에서는 $2를 두 경우 모두 설정했으며, PCRE에서도 TRUE입니다. 앞으로 펄이 이 차이를 일관성 있게 변경한다면, PCRE는 그 변경에 따를 것입니다. 또다른 해결되지 않은 모순점은 펄 5.005_02가 패턴 /^(a)?(?(1)a|b)+$/를 문자열 "a"에 매치하지만, PCRE는 하지 않습니다. 그러나 펄과 PCRE 모두 /^(a)?a/를 "a"에 매치하고 $1을 설정하지 않습니다. PCRE는 펄 정규표현식 기능의 몇가지 확장을 지원합니다: lookbehind 단정은 고정 길이 문자열에만 매치해야하지만, 양자 택일의 lookbehind 단정에서는 다른 길이의 문자열을 매치할 수 있습니다. 펄 5.005에서는 모두 같은 길이를 가질 것을 요구합니다. PCRE_DOLLAR_ENDONLY를 설정하고 PCRE_MULTILINE를 설정하지 않으면 $ 메타 문자는 문자열의 가장 마지막에만 매치합니다. PCRE_EXTRA를 설정하면, 백슬래쉬 뒤에 특별한 의미를 가지지 않는 문자의 사용은 실패하게 됩니다. PCRE_UNGREEDY를 설정하면, 반복 수량어의 greediness가 뒤집어져서, 기본값으로 greedy하지 않게 됩니다. 하지만 뒤에 물음표가 붙으면 greedy하게 됩니다.
정규표현식 상세소개아래 설명은 PCRE가 지원하는 정규표현식의 문법과 의미입니다. 정규표현식은 펄 문서 및 많은 책들에 설명이 있으며, 그 중 일부에는 풍부한 예제를 가지고 있습니다. O'Reilly에서 출판한 Jeffrey Friedl의 "Mastering Regular Expressions"(ISBN 1-56592-257-3)는 예제들을 매우 자세하게 다루고 있습니다. 여기의 설명은 레퍼런스 문서에 따릅니다. 정규표현식은 주어진 문자열에 대하여 왼쪽에서 오른쪽으로 매치하는 패턴입니다. 문자열은 패턴으로 준비하고, 목표에서 대응하는 문자열에 매치합니다. 간단한 예로, 패턴 The quick brown fox는 목표 문자열의 동일한 부분에 매치합니다. 메타 문자정규표현식이 강력한 이유는 패턴에 선택과 반복을 포함할 수 있다는 점입니다. 이는 특별한 방법으로 해석하는 메타 문자를 사용하여 패턴에 넣습니다. 메타 문자는 두가지 종류가 존재합니다: 대괄호 안을 제외하고 패턴의 어디에서라도 작동하는 종류와, 대괄호 안에서만 작동하는 종류입니다. 다음은 대괄호 밖에서 사용하는 메타 문자들입니다. - \
여러가지로 사용하는 일반적인 이스케이프 문자 - ^
목표의 처음 (멀티라인 모드에서는 줄의 처음) - $
목표의 마지막 (멀티라인 모드에서는 줄의 끝) - .
(기본값으로) 줄바꿈을 제외한 아무 문자 - [
클래스 정의 시작 문자 - ]
클래스 정의 끝 문자 - |
선택 브랜치 시작 - (
서브패턴 시작 - )
서브패턴 끝 - ?
( 의미 확장, 또는 0회나 1회, 또는 수량어 minimizer - *
0회 이상의 횟수 - +
1회 이상의 횟수 - {
최소/최대 횟수 시작 - }
최소/최대 횟수 끝
대괄호 안쪽의 패턴은 "문자 클래스"라고 부릅니다. 다음은 문자 클래스에서 사용하는 메타 문자들입니다: - \
일반적인 이스케이프 문자 - ^
처음 문자로 올 때, 부정 클래스로 설정 - -
문자 범위 지정 - ]
문자 클래스 종료
다음 섹션은 각 메타 문자의 사용을 설명합니다. 백슬래쉬백슬래쉬 문자는 여러가지 사용법을 가집니다. 먼저, 뒤에 영숫자가 아닌 문자가 붙는다면, 그 문자가 가지고 있는 특별한 의미가 사라집니다. 이러한 이스케이프 문자로 백슬래쉬를 사용하는 것은 문자 클래스 안과 밖 양쪽에 모두 적용됩니다. 예를 들어, "*" 문자를 매치하길 원한다면, 패턴에는 "\*"로 써야합니다. 이는 따라오는 문자가 메타 문자이던 아니던간에 관계 없이 적용하기 떄문에, 영숫자가 아닌 문자에 그 자체를 사용하기 위해 "\"를 붙이는 것이 항상 안전합니다. 특히, 백슬래쉬를 매치하고자 한다면, "\\"로 써야합니다. 패턴에 PCRE_EXTENDED 옵션을 사용하면, 패턴에 존재하는 (문자 클래스 안이 아닌) 공백, 그리고 문자 클래스 밖의 "#"사이의 문자와 바로 뒤의 줄바꿈 문자를 무시합니다. 이스케이프하는 백슬래쉬를 공백이나 "#"문자를 패턴에 넣기 위해 사용할 수 있습니다. 백슬래쉬의 두번째 사용법은 패턴에서 출력할 수 없는 문자를 보여지게 인코딩하는 방법을 제공합니다. 바이너리 제로가 패턴 종료를 의미하는걸 제외하면, 출력할 수 없는 문자가 나타나는 제한은 존재하지 않습니다. 그러나 패턴을 텍스트 편집으로 준비할 때는, 다음의 이스케이프 시퀀스를 사용하는 편이 바이너리 문자를 직접 표현하는 것보다 간편합니다: - \a
알람, BEL 문자(hex 07) - \cx
"control-x", x는 임의의 문자 - \e
이스케이프 (hex 1B) - \f
폼피드 (hex 0C) - \n
줄바꿈 (hex 0A) - \r
캐리지 리턴 (hex 0D) - \t
탭 (hex 09) - \xhh
16진 코드 hh 문자 - \ddd
8진 코드 ddd 문자, 혹은 역참조
"\cx"의 효과는 다음과 같이 계산합니다: "x"가 소문자라면, 대문자로 변환합니다. 그 후, 문자의 6번째 비트(hex 40)가 뒤집어집니다. 즉 "\cz"은 hex 1A가 되고, "\c{"은 hex 3B, 그리고 "\c;"은 hex 7B가 됩니다. "\x" 뒤에, 두개의 16진 숫자를 읽습니다. (대소문자는 구별하지 않습니다) "\0"은 다음의 두자리의 8진수를 읽습니다. 양쪽 모두, 두자리가 되지 않을 경우, 그 표현을 그대로 사용합니다. 즉 "\0\x\07" 시퀀스는 두개의 바이너리 제로에 이어지는 BEL 문자를 정의합니다. 바로 뒤에 8진수로 인식되는 문자가 이어질 경우에는 처음의 제로 뒤에 두자리 수를 써야한다는 것을 잊지 마십시오. 백슬래쉬 뒤에 0이 아닌 수가 올 경우에 혼동할 수 있습니다. 문자 클래스 밖에서, PCRE는 그것과 따라오는 수를 10진수로 읽습니다. 수가 10보다 작거나, 표현식에서 수 이상의 묶음을 잡아냈다면, 이 시퀀스는 역참조가 됩니다. 이 작동에 관해서는 아래에, 묶음 서브패턴에 설명이 있습니다. 문자 클래스 안이나, 10진수 9 이상이 없고 서브패턴이 그만큼 존재하지 않을 경우, PCRE는 백슬래쉬 뒤의 세자리 8진수로 다시 읽어들여, 해당하는 8비트 값으로 하나의 바이트를 생성합니다. 어떠한 수라도 사용할 수 있습니다. 예를 들면: - \040
스페이스의 다른 표현 방법 - \40
40개 미만의 서브 패턴을 검출하였을때, 동일한 의미 - \7
항상 역참조 - \11
역참조, 혹은 탭의 다른 표현 방법 - \011
항상 탭 - \0113
문자 "3"이 따라오는 탭 - \113
8진 코드 113 문자 (역참조는 99까지입니다) - \377
1비트만을 제외한 바이트 - \81
역참조이거나 "8"과 "1"의 두 문자가 붙는 바이너리 제로
100이상의 8진 값은 앞에 제로가 붙지 않아야만 합니다. 세자리를 넘어가는 8진 값은 읽지 않습니다. 하나의 바이트값을 정의하는 모든 시퀀스는 문자 클래스 내외, 어디에서도 사용할 수 있습니다. 추가로, 문자 클래스 안에서 "\b" 시퀀스는 백스페이스 문자(hex 08)로 해석합니다. 문자 클래스 밖에서는 다른 의미를 가집니다. (아래를 참고) 백슬래쉬의 세번째 사용법은 일반적인 문자 타입의 지정입니다: - \d
임의의 10진 숫자 - \D
10진 숫자가 아닌 임의의 문자 - \s
임의의 공백 문자 - \S
공백이 아닌 임의의 문자 - \w
임의의 "word" 문자 - \W
임의의 "non-word" 문자
각 이스케이프 시퀀스 조합은 완전한 문자 세트를 두개의 개별 세트로 분리합니다. 주어진 문자는 각 조합의 한쪽에만 매치합니다. "word" 문자는 어떠한 문자나 숫자, 혹은 언더스코어(_)입니다. 즉, 펄의 "word"에 해당하는 어떠한 문자입니다. 문자와 숫자의 정의는 PCRE의 문자 테이블이 제어하고, 로케일 특정 매칭이 존재할 경우에는 다양할 수 있습니다. (위쪽의 "로케일 지원" 참고) 예를 들어, "fr"(프랑스어) 로케일에서는, 128 이상의 몇몇 코드를 엑센트 문자를 나타내는데 사용하며, 이들은 \w에 매치합니다. 문자형 시퀀스는 문자 클래스 안과 밖에서 모두 사용할 수 있습니다. 각각 해당하는 형의 한 문자에 매치합니다. 현재 매칭 위치가 목표 문자열의 마지막이라면, 전부 실패하고, 어떠한 문자도 매치하지 않습니다. 백슬래쉬의 네번째 사용법은 간단한 단정입니다. 단정은 조건이 목표 문자열에서 다른 부분에 매치하지 않고, 특정한 위치에만 매치하도록 지정합니다. 복잡한 단정을 위한 서브패턴의 사용법은 아래에 설명이 있습니다. 백슬래쉬 단정은 다음과 같습니다. - \b
word 경계 - \B
word 경계가 아님 - \A
목표의 처음 (멀티라인 모드와 무관) - \Z
목표의 마지막이나 마지막에서 줄바꿈 (멀티라인 모드와 무관) - \z
목표의 마지막 (멀티라인 모드와 무관)
단정은 문자 클래스 안에서 사용할 수 없습니다. ("\b"가 문자 클래스 안에서는 백스페이스 문자를 나타내는 점에 주의하십시오) word 경계는 현재 문자와 이전 문자가 둘 다 \w에 매치하지 않거나 둘 다 \W에 매치하지 않는 (즉, 하나는 \w에 매치하고 다른 하나는 \W에 매치) 목표 문자열의 위치이거나, 처음이나 마지막 문자가 \w에 매치할 경우는 문자열의 처음이나 마지막입니다. \A, \Z, \z 단정은 전통적인 circumflex와 달러와는 달리 옵션과 관계 없이 목표 문자열의 가장 처음이나 가장 마지막에만 매치합니다. 이들은 PCRE_MULTILINE이나 PCRE_DOLLAR_ENDONLU 옵션에 영향을 받지 않습니다. \Z와 \z의 차이는, \Z가 문자열의 마지막뿐만 아니라 문자열 마지막 문자가 줄바꿈일 경우에는 바로 앞에도 매치하지만, \z는 마지막에만 매치합니다.
출처: http://www.php.net/manual/kr/pcre.pattern.syntax.php
-------------------------------------------------------------------------------
array preg_grep ( string pattern, array input [, int flags]) preg_grep()은 주어진 pattern에 매치되는 input 배열의 요소를 포함하는 배열을 반환합니다.
EXAMPLE:
$food = array('apple', 'banana', 'squid', 'pear');
$fruits = preg_grep("/squid/", $food, PREG_GREP_INVERT);
echo "Food "; print_r($food);
echo "Fruit "; print_r($fruits);
RESULTS IN:
Food Array
(
[0] => apple
[1] => banana
[2] => squid
[3] => pear
)
Fruit Array
(
[0] => apple
[1] => banana
[3] => pear
) 출처: http://www.php.net/manual/kr/function.preg-grep.php
-------------------------------------------------------------------
preg_match -- 정규표현식 매치를 수행합니다.
예 1. 문자열 "php" 찾기 <?php
if (preg_match("/php/i", "PHP is the web scripting language of choice.")) {
echo "발견하였습니다.";
} else {
echo "발견하지 못했습니다.";
}
?>
|
|
예 2. 단어 "Web" 찾기 <?php
if (preg_match("/\bweb\b/i", "PHP is the web scripting language of choice.")) {
echo "발견하였습니다.";
} else {
echo "발견하지 못했습니다.";
}
if (preg_match("/\bweb\b/i", "PHP is the website scripting language of choice.")) {
echo "발견하였습니다.";
} else {
echo "발견하지 못했습니다.";
}
?>
|
|
예 3. URL에서 도메인 이름 얻기 <?php
preg_match("/^(http:\/\/)?([^\/]+)/i",
"http://www.php.net/index.html", $matches);
$host = $matches[2];
preg_match("/[^\.\/]+\.[^\.\/]+$/", $host, $matches);
echo "도메인 이름은: {$matches[0]}\n";
?>
|
이 예제의 결과: |
출처: http://www.php.net/manual/kr/function.preg-match.php
------------------------------------------------------------------------
< 참고 >
-----------------------------------------------------------------------------
1. ereg(string pattern, string string, array [regs])
해당 문자열에서 주어진 정규 표현식 패턴과의 일치 되는 문자열을 검색합니다.
2. ereg_replace(string pattern, string replacement, string string)
해당 문자열에서 주어진 정규 표현식 패턴과의 일치 되는 문자열을 검색하고 바꿀 문자열로 대체합니다.
3. eregi(string pattern, string string, array [regs])
ereg() 함수와 동일하나 검색을 할 때 대, 소 문자를 구분하지 않습니다.
4. eregi_replace(string pattern, string replacement, string string)
ereg_replace()와 동일하나 검색을 할 때 대, 소 문자를 구분하지 않습니다.
5. split(string pattern, string string, int [limit])
지정한 패턴과 일치하는 문자열을 경계로 해당 문자열을 나누고 배열에 저장합니다.
정규 표현식 패턴의 종류
정규 표현식은 주로 게시판의 입력 사항에서 사용 되어 집니다. 가령 비밀번호나 기타 이름 등을 입력할 때
주어진 조건에 맞게 입력하게끔 하는 것입니다.
" . " - 이 표현은 c.y처럼 표현하기도 하고 .cy로 하기도 합니다.
즉, 전자는 c로 시작 하면서 y로 끝나는 문자를 나타냅니다.
(cry , cay , cat) 물론 여기서 . 은 한 문자만을 가리키는 것입니다.
후자는 문자열이 cy로 끝나는 문자열을 나타냅니다(xcy, xcy). 잘못된 표현은 전자의 경우
csdy, cfgy , cy입니다. " . " 은 한문자 만을 나타냅니다.
" ? " - ?앞의 문자가 있거나 없음을 나타냅니다. 즉, sc?y 는 sy , scy , scyf , frsy …와 일치합니다.
" + " - +는 앞의 문자를 가리키며 최소 하나 이상의 문자임을 나타냅니다.
즉, c+ry는 cry, ccry, cccry, cryhj … 와 일치합니다.
" * " - * 는 앞의 문자가 없거나 하나 이상의 문자임을 나타냅니다.
즉, c*ry 는 ry, cry, cccry … 과 일치합니다. 또 cry* 는 y가 없거나 하나 이상 문자임을 나타냅니다.
cr, cry, cry, cryyy …. 와 일치합니다.
" $ " - $는 해당 문자열의 마지막 부분을 가리킵니다. 즉, c?ry$ 는 ry로 끝나는 문자열에서 앞의 문자가 c가
있거나 없는 문자열을 나타냅니다.
cry , ry , skycry …와 일치합니다. c?r+$ 는 앞의 문자 c 가 있거나 없는 문자이며 r로 적어도 하나이상
끝나는 문자열을 나타냅니다. r , cr , crr , crrr … 와 일치합니다.
" ^ " - ^ 는 뒤 문자열로 시작되는 모든 문자열을 나타냅니다.
즉, ^cry 는 cry is good, cry is very good, crypdf … 와 일치합니다.
또 ^cry?df는 y가 있거나 없는 crydf , crdf로 시작하는 모든 문자열을 나타냅니다.
crydf is good, crdfgg …와 일치합니다.
이렇게 이 기호들은 상호 같이 사용해서 문자열을 표현합니다.
" [ ] " - [ ] 는 이 안의 문자 중에 하나의 문자를 표현합니다. 그리고 [ ] 안의 문자의 표현은
"-" 를 사용해서 합니다.
즉, [a-z] 는 영문의 소문자 한글자를 포함하는 모든 문자열을 나타냅니다.
A2sdr , skycry , cry , zzzz …. 와 일치합니다.
또 [a-zA-Z0-9] 는 영문 대,소문자 와 십진수 한자를 포함하는 모든 문자열을 나타냅니다.
a4df, Cry44 is passw , 4ded … 등과 일치합니다.
[cC][yY] 는 cy , cY , Cy , CY 를 포함하는 문자열을 나타냅니다. Cycap , Cyclub … 등과 일치합니다.
만약 해당하는 문자를 제외한 문자열과의 일치를 나타내려면 ^기호를 [] 안에 사용합니다.
[^a-z]는 영문 소문자를 제외한 한글자를 포함하는 문자열을 나타냅니다.
Cry44, skycryGood, 444 is passw … 와 일치합니다.
물론 영문 자체의 입력을 하지 못하게 하려면 [^a-zA-Z]로 표현할 수 있습니다.
[ ] 는 일정한 문자의 표현은 간단하게 표현할 수도 있습니다. 클래스화된 방법을 사용합니다.
즉, [[:space:]]는 공백 문자를 나타냅니다 ( ) 와 일치합니다.
[[:digit:]]는 숫자 하나를 나타냅니다. [0-9]와 일치합니다.
[[:alpha:]]는 영문 알파벳 하나를 나타냅니다. [a-zA-Z] , [a-Z]와 일치합니다.
[[:alnum:]]는 영문 알파벳 문자와 숫자 중 하나를 나타냅니다. [a-zA-Z0-9]와 일치합니다.
" { } " - { }는 {숫자}로 표현하며 중괄호 안의 숫자는 앞의 문자의 개수를 나타냅니다.
C{4}ry는 C가 ry 앞에 4개 존재하는 문자열을 나타냅니다.
CCCCry를 나타냅니다. C{4,}ry는 C가 ry 앞에 적어도 4개 이상인 문자열을 나타냅니다.
CCCCry , CCCCCry , CCCCCCry … 와 일치합니다.
C{1,4}ry 는 C 가 ry 앞에 1 ~ 4개 존재하는 문자열을 나타냅니다.
Cry , CCry , CCCry , CCCCry 와 일치합니다.
" ( ) " - ( ) 는 이 안의 문자를 그룹화합니다.
sky(cry)* 는 sky 뒤에 cry 가 하나 이상 있거나 없는 문자열을 나타냅니다.
sky , skycry is good , skycrycrydd …. 와 일치합니다.
" | " - | 는 OR 연산을 나타내 줍니다.
sky|cry 는 sky 나 cry 를 나타내는 문자열을 나타냅니다. sky is good , cry is good..와 일치합니다.
sky(cry|g)* 는 sky 뒤에 cry 나 g 가 없거나 하나 이상 존재하는 문자열을 나타냅니다.
sky , skycry , sky is good , skygjjh … 등과 일치합니다.
특수 기호 패턴에 비교하기 -
특수 기호 " ^ . [ ] $ ( ) | * + ? { } \ " 앞에 \를 붙여 표현합니다.
하지만 [ ] 안에서 특수 기호를 사용할 경우 \를 붙이지 않고 그냥 표현합니다.
\$+ 는 문자열 앞에 $ 기호가 하나 이상 포함된 문자열을 나타냅니다.
$cry , $$$sky … 등과 일치합니다.
[^.[]?*{}/\] 는 문자열 중에 "^" , " ." , " [" , " ]" , "? " , " * " , " { " ,
" } " , "/ " , "\"문자가 포함된 문자열을 나타냅니다. Hi? , {cry} , … 등과 일치합니다.
출처: http://www.junjaewoo.com/kldp/ApacheMySQLPHP_Guide-KLDP-html/ApacheMySQLPHP_Guide-KLDP-8.html#ss8.1
-------------------------------------------------------------------------------
< 테스트 예제 > 위 내용들을 적용한 테스트 소스~ 문의는 http://blog.naver.com/etwas0227.do 에게루~
<?
// ex) php 에서 해당 페이지 접속한 client ip 구하기 //
$ip = $_SERVER['REMOTE_ADDR'];
$fullhost = gethostbyaddr($ip);
echo ("Client IP : $ip <br>");
echo ("Fullhost : $fullhost <br>");
echo ("Server IP : $ServerIP <br><br>");
// ex) php 에서 아이피 추출하기 //
// preg_match 함수적용
echo ("preg_match - Fullhost Sample : 123.10.101.102 <br>");
preg_match("/^([^\.]+)+\.([^\.]+)/i", "123.10.101.102", $matches); //1,2 단계 아이피 추출
echo ("1,2 단계 아이피 : $matches[0] <br>");
preg_match("/[^\.\/]+\.[^\.\/]+$/", "123.10.101.102", $matches); //3,4 단계 아이피 추출
echo ("3,4 단계 아이피 : $matches[0] <br>");
preg_match("/^([^\.]+)+\.([^\.]+)+\.([^\.]+)/i", "123.10.101.102", $matches); //1,2,3 단계 아이피 추출
echo ("1,2,3 단계 아이피 : $matches[0] <br><br>"); //결과 : 123.10.101
// preg_replace 함수적용
echo ("preg_replace - Fullhost Sample : 123.10.101.102 <br>");
$fullhost = "123.10.101.102";
//$host = preg_replace("/*./", "*.*.", $fullhost);
//$fullhost = preg_replace("/^[^\.]+\.[^\.]+/", "*", $fullhost);
$fullhost = preg_replace("/^([^\.]+)+\.([^\.]+)/", "*.*", $fullhost);
echo ("Fullhost 해당 패턴 변형 : $fullhost <br>");
?>
<br>
<? // 특정 아이피 접속자만 해당 페이지 보여주기
$ip = $_SERVER['REMOTE_ADDR'];
$client_ip = gethostbyaddr($ip); //사용자 접속아이피
preg_match("/^([^\.]+)+\.([^\.]+)/i", $client_ip, $matches); //두 단계 아이피를 추출
$match_ip = $matches[0];
if ($match_ip == "12.34.56.78") { //추출한 아이피와 접속가능 아이피 비교
echo ("Match IP : $matches[0] <br>"); //해당페이지 내용보여줌
}
else
exit; //해당페이지 내용보여주지 않음
?>
<br> |
0