shop-wiz logo
PHP 정규표현식 상세
참조 : http://kr2.php.net/manual/kr/regexp.reference.php
\ (backslash)
- 여러가지로 사용하는 일반적인 회피 문자
이스케이프 특수 문자 - 백슬래시(\) 다음에 나오는 문자입니다. 왼쪽 중괄호({), 캐럿(^) 또는 그 밖의 일부 특수 문자처럼 정규식 구문에 사용되는 문자를 찾는 데 사용할 수 있습니다. 예를 들어 \$를 사용하면 '줄의 끝'을 나타내는 정규식을 구현하는 것이 아니라 달러 기호($) 자체를 검색하게 됩니다. 마찬가지로 정규식 \.를 사용하면 마침표(.)가 정규식으로 사용될 때처럼 임의의 한 문자를 검색하는 것이 아니라 마침표(.) 문자 자체를 검색하게 됩니다.
^(caret)
- 목표의 처음 (멀티라인 모드에서는 줄의 처음) , [ ] 에서 처음 문자로 올 때, 부정 클래스로 설정
줄의 시작 - 줄의 시작 위치에 지정된 텍스트가 나올 경우입니다. 예를 들어 정규식 ^When in은 "When in the course of human events"나 "When in town, call me"와 같이 "When in"으로 시작하면서 "When in"이 줄의 시작 위치에 나오는 모든 문자열을 검색합니다. 그러나 이 정규식은 줄의 시작에 나오는 "What and when in the course of human events"와는 일치하지 않습니다.
예) ^shop (문자열의 처음에 shop을 포함하면 true, else false)
$(dollar)
- 목표의 마지막 (멀티라인 모드에서는 줄의 끝)
줄의 끝 - 줄의 끝 위치에 지정된 텍스트가 나올 경우입니다. 예를 들어 정규식 professional$는 문자열 "He is a professional"의 끝 부분과 일치하지만 문자열 "They are a group of professionals"와는 일치하지 않습니다.
예) wiz$(문자열의 끝에 wiz를 포함하면 true, else false)
.(period)
- (기본값으로) 줄바꿈을 제외한 임의의 한 문자
- 출력 여부에 관계없이 모든 단일 문자와 일치하는 와일드카드 역할을 합니다. 단, 줄 바꿈(\n) 문자는 제외됩니다. 예를 들어 정규식 c.t는 문자열 cat, c t, cot와 일치하지만 cost와는 일치하지 않습니다. 이 예에서 마침표(.)는 단일 문자를 나타내는 와일드카드입니다. 문자 'c'와 't' 사이에 마침표가 있으므로 문자 'c'와 't' 사이에 단일 문자(공백 포함)가 있는 문자열은 모두 이 식과 일치합니다.
[ ](bracket)
- 허용 혹은 비허용 문자 범위를 지정합니다.
문자 집합 - 대괄호([]) 안에 지정된 임의의 한 문자입니다. [a-z]과 같이 하이픈(-)을 사용하여 문자 범위를 지정할 수 있습니다. 예를 들면 다음과 같습니다.
  • 정규식 c[aou]t는 cat, cot 및 cut와 일치하지만 cet나 cit와는 일치하지 않습니다.
  • 정규식 [0-9]는 임의의 숫자를 의미합니다. 복수 범위의 문자도 지정할 수 있습니다.
  • 정규식 [A-Za-z]는 모든 대소문자와 일치합니다.
  • []내에서 "^"이 선행되면 not을 나타냄
  • [:문자클래스:]의 형태가 있다(문자클래스 - alpha, blank, cntrl, digit, graph, lower, print, space, uppper, xdigit)
예) [abc] (a, b, c 중 어떤 문자, "[a-c]."과 동일), [Yy] (Y 또는 y), [A-Za-z0-9] (모든 알파벳과 숫자), [-A-Z]. ("-"(hyphen)과 모든 대문자), [^a-z] (소문자 이외의 문자), [^0-9] (숫자 이외의 문자), [[:digit:]] ([0-9]와 동일)
|(bar)
-선택 브랜치 시작, 정규식 패턴의 "또는, OR"을 의미합니다. 
또는 - 두 항목 사이의 선택을 나타냅니다. 즉, OR 기호(|)의 앞이나 뒤에 나오는 식과 일치합니다. 예를 들어 정규식 (him|her)는 "it belongs to him" 또는 "it belongs to her"와 일치하지만 "it belongs to them" 줄과는 일치하지 않습니다.
( )(parenthesis)
- 서브패턴을 지정합니다.
그룹 식 - 하위 식의 시작과 끝을 표시합니다. 하위 식은 (ha)+와 같이 괄호 ( ) 안에 포함되는 정규식입니다. 이 예에서는 더하기 기호(+)가 괄호 ( ) 그룹 식과 조합되어 하나의 구문이 됩니다. 괄호 ( ) 안에 들어 있는 (ha)가 하위 식입니다. 더하기 기호(+)를 추가하면 반복되는 문자 쌍을 찾을 수 있습니다. 더하기 기호(+)는 'ha'가 1번 이상 있을 수 있음을 의미합니다. 이 식은 'haha' 및 'hahaha'와 일치합니다.
?(asterisk)
- ( 의미 확장, 또는 0회나 1회, 또는 수량어 minimizer 바로 앞 패턴에 대해 있거나/없다 를 의미합니다.
*(asterisk)
- 0회 이상의 횟수, 바로 앞 패턴에 대해 없거나/여러개를 의미합니다.
최대(0개 이상) - 가능한 많은 수의 문자와 일치하면서 식 앞의 문자를 0번 이상 반복합니다. 정규식 .*는 한 문자를 0번 이상 반복합니다. 예를 들어 정규식 b.*k는 book, back, black, blank 및 buck와 일치합니다. 이 예에서는 마침표(.)가 별표(*)와 조합되어 하나의 구문이 됩니다. 마침표(.)는 별표(*) 식 바로 앞에 옵니다. 별표(*)는 'b'와 'k' 사이에 임의의 문자가 0번 이상 있을 수 있음을 의미합니다. 마침표(.)는 'b'와 'k' 사이의 문자에 대한 와일드카드 역할을 합니다. 이 예에서는 'b'와 'k' 사이에 임의의 문자가 반복될 수 있음을 의미합니다.
+(asterisk)
- 바로 앞 패턴에 대해 1개 이상을 의미합니다.
최대(1개 이상) - 가능한 많은 수의 문자와 일치하면서 식 앞의 문자를 1번 이상 반복합니다. 정규식 .+는 한 문자를 1번 이상 반복합니다. 예를 들어 정규식 bo+.는 bob, book 및 boot와 일치합니다. 이 예에서는 마침표(.)가 더하기 기호(+)와 조합되어 하나의 구문이 됩니다. 마침표(.)는 더하기 기호(+) 식 바로 뒤에 옵니다. 더하기 기호(+)는 문자 'o'가 1번 이상 있을 수 있음을 의미합니다. 마침표(.)는 각 단어의 마지막 문자(이 예에서는 'b', 'k' 및 't')에 대한 와일드카드 역할을 합니다.
{}(brace)
- 최소/최대 횟수 시작, 바로 앞 패턴(선행문자)의 갯수를 지정합니다.
태그가 지정된 식 - 괄호 안에 포함된 식과 일치하는 텍스트에 태그를 지정합니다. \N을 사용하면 찾기 식에서 태그가 지정된 텍스트의 다른 항목을 검색하거나 바꾸기 식에서 태그가 지정된 텍스트를 삽입할 수 있습니다. 예를 들어 연속된 두 개의 중복 단어를 검색하려면 {.#} \1 식을 사용합니다. 연속된 단어가 공백 하나로 구분된다고 가정하면 오른쪽 중괄호(})와 백슬래시(\) 사이에 공백을 추가할 수 있습니다. 이 예에서는 # 기호와 마침표(.)가 중괄호({})와 조합되어 하나의 구문이 됩니다. 이 식에서 .#는 임의의 연속 문자를 나타냅니다. 식에서 이 부분은 중괄호({})로 묶여 있으므로 해당 연속 문자에는 태그가 지정되며 이를 \1로 나타낼 수 있습니다. 이 식은 연속 문자 다음에 공백이 오고 그 다음에 정확히 동일한 연속 문자가 또 나오는 경우를 찾습니다.
예) a{3} ('a'의 3번 반복인 aaa만 해당됨), a{3,} ('a'가 3번 이상 반복인 aaa, aaaa, aaaa, ... 등), a{3,5} (a가 3~5번 반복인 aaa, aaaa, aaaaa 만 해당됨), [0-9]{2} (두 자리 숫자), a[7-9]{2} (7~9인숫자가 2개 나옮), [^Aa]{3} (A와 a를 포함하지 않는 3개의 문자열), .{3,4}com ('com'앞에 3~4개의 문자를 포함하는 문자열)
\d
임의의 10진 숫자
\D
10진 숫자가 아닌 임의의 문자
\h
수평 공백 문자 (PHP 5.2.4부터)
\H
수평 공백 문자를 제외한 모든 문자 (PHP 5.2.4부터)
\s
모든 공백 문자
\S
공백이 아닌 모든 문자
\v
수직 공백 문자 (PHP 5.2.4부터)
\V
수직 공백 문자를 제외한 모든 문자 (PHP 5.2.4부터)
\w
모든 "word" 문자
\W
모든 "non-word" 문자
@
- 정규식 .@는 한 문자를 0번 이상 반복합니다. 예를 들어 정규식 a.@x는 'abxbxb' 내의 'abx'와 'acxcxc' 내의 'acx'와 일치합니다. 이 예에서는 마침표(.)가 @ 기호와 조합되어 하나의 구문이 됩니다. 마침표(.)는 @ 기호 식 바로 앞에 옵니다. @ 기호는 'a'와 'x' 사이에 임의의 문자가 0번 이상 있을 수 있음을 의미합니다. 이 예에서 마침표(.)는 문자 'a'와 'x' 사이의 문자 'b' 및 'c'에 대한 와일드카드 역할을 합니다.
#
-예를 들어 정규식 si.#er는 'sicker' 또는 'silkier'와 일치합니다. 이 예에서는 마침표(.)가 # 기호와 조합되어 하나의 구문이 됩니다. 마침표(.)는 # 기호 식 바로 앞에 옵니다. # 기호는 'si'와 'er' 사이에 임의의 문자가 0번 이상 있을 수 있음을 의미합니다. 마침표(.)는 단어 sicker에 있는 문자 'c' 및 'k'와 단어 silkier에 있는 문자 'l', 'k' 및 'i'에 대한 와일드카드 역할을 합니다.
\N
- N번째 태그가 지정된 식 - 찾기 식에서 \N은 N번째 태그가 지정된 식과 일치하는 텍스트를 나타냅니다. 여기에서 N은 1부터 9까지의 숫자입니다. 바꾸기 식에서 \N은 N번째 태그가 지정된 식과 일치하는 텍스트를 삽입합니다. 여기에서 N은 1부터 9까지의 숫자입니다. \0은 전체 찾기 식과 일치하는 텍스트를 삽입합니다. 예를 들어 연속된 두 개의 중복 단어를 찾아 한 단어로 바꾸려면 {.#} \l 식을 사용합니다. 연속된 단어가 공백 하나로 구분된다고 가정하면 오른쪽 중괄호(})와 백슬래시(\) 사이에 공백을 추가할 수 있습니다. 이 예에서는 # 기호와 마침표(.)가 중괄호({})와 조합되어 하나의 구문이 됩니다. 바꿀 때는 \l 식을 사용합니다. \1은 찾기 문자열의 첫 번째 중괄호 쌍에서 찾은 내용을 나타냅니다. 바꾸기 작업에서 \1을 사용하면 연속된 중복 단어를 해당 단일 단어로 바꿀 수 있습니다.
~x
- 구분 안 함 - 식의 지정된 위치에 x가 나타날 경우 해당 항목을 검색에서 제외합니다. 예를 들어 정규식 real~(ity)는 "realty"와 "really"의 "real"은 구분하지만 "reality"의 "real"은 구분하지 않습니다.
\n
- 바꿈 - 코드 보기의 새 줄 또는 디자인 보기의
입니다. 이 구문(\n)을 사용하면 모든 줄 바꿈을 간단하게 나타낼 수 있습니다.
\t
- ^\t+ 이 예에서는 캐럿(^)과 더하기 기호(+)가 탭(\t)과 조합되어 하나의 구문이 됩니다. 단일 탭 문자 식 앞에 오는 캐럿(^)은 탭이 지정된 모든 문자가 줄의 시작 위치에 있는 경우만 검색합니다. 더하기 기호(+)는 일치하는 하나 이상의 탭 문자를 나타냅니다.
[^]
- 집합에 없는 한 문자 - 캐럿(^) 뒤의 문자 집합에 없는 한 문자를 나타냅니다. 예를 들어 범위에 없는 문자를 제외한 임의의 문자를 나타내려면 여는 괄호 뒤에 첫 문자로 캐럿(^)을 사용합니다. [^269A-Z] 식은 2, 6, 9 및 모든 대문자를 제외한 모든 문자와 일치합니다.
n
- 반복 식 - 캐럿(^) 앞에 있는 식을 n번 반복합니다. 예를 들어 n이 4인 식 [0-9]^4는 네 자리 수를 모두 검색합니다. 실제로도 이 예와 같이 문자 집합([ ]) 구문과 반복(^n) 구문을 조합하여 많이 사용하고 있습니다.
:a
- [a-zA-Z0-9] 식을 사용하여 하나의 대소문자 또는 숫자 항목을 검색할 수 있습니다. 영숫자 항목이라고도 합니다. [a-zA-Z0-9]의 모든 인스턴스에 줄임 식 :a를 사용할 수 있습니다.
:b
- 공백 - 코드 또는 텍스트의 공백입니다. 예를 들어 줄의 시작 위치에서 단일 공백 문자를 검색하려면 정규식 ^:b를 사용합니다.
:c
- 영문자 - [a-zA-Z] 식과 일치합니다. 이 식을 사용하여 모든 대소문자를 나타낼 수 있습니다. [a-zA-Z]의 모든 인스턴스에 줄임 식 :c를 사용할 수 있습니다.
:d
- 10진수 - [0-9] 식과 일치합니다. 이 식을 사용하여 모든 숫자를 나타낼 수 있습니다. 예를 들어 텍스트 파일에서 주민 등록 번호를 찾으려는 경우 주민 등록 번호 형식인 000000-0000000을 :d^6-:d^7로 나타내거나 [0-9]를 사용하여 동일한 식인 [0-9]^6-[0-9]^7로 나타낼 수 있습니다. [0-9]의 모든 인스턴스에 줄임 식 :d를 사용할 수 있습니다.
:h
- 16진수 - [0-9a-fA-F]+ 식과 일치합니다. 'A'와 'F' 사이의 대소문자와 숫자를 사용한 16진수 조합을 나타내려면 이 식을 사용합니다. 예를 들어 웹 사이트 페이지에 서로 다른 여러 가지 배경색이 있고 해당 페이지의 색을 검정(예: 000000)으로 변경하려 하지만 기존 색의 16진수를 모르는 경우 기존 16진수를 모두 찾으려면 다음 정규식을 사용합니다. \#:h [0-9a-fA-F]를 사용하여 검색할 수도 있지만 이 예에서는 백슬래시(\)와 # 기호가 16진수(:h) 구문과 조합됩니다. \#는 식이 아닌 # 기호를 검색하며 :h는 모든 16진수 문자를 검색합니다. 기존 16진수를 바꾸려면 000000과 같이 원하는 배경색의 16진수를 입력합니다.
:i
- 식별자 - [a-zA-Z_$][a-zA-Z0-9_$]* 식과 일치합니다. 코드 작업을 할 때 모든 프로그램 식별자를 검색하려면 위의 긴 식을 입력하는 대신 줄임 식 :i를 사용할 수 있습니다.
:n
- 유리수 - ([0-9]+\.[0-9]*)|([0-9]*\.[0-9]+)|([0-9]+) 식과 일치합니다. 소수점을 포함하는 정수를 모두 검색하려면 위의 긴 식을 입력하는 대신 줄임 식 :n을 사용할 수 있습니다.
:q
- 따옴표 붙은 문자열 - ("[~"]*")|('[~']*') 식과 일치합니다. 인용 부호 안에 들어 있는 인용문을 모두 검색하려면 위의 긴 식을 입력하는 대신 줄임 식 :q를 사용할 수 있습니다.
:w
- 영문 문자열 - [a-zA-Z]+ 식과 일치합니다. 이 구문을 사용하면 대소문자에 관계없이 간단하게 영문자를 하나 이상 나타낼 수 있습니다.
:z
- 10진수 정수 - [0-9]+ 식과 일치합니다. 이 구문을 사용하면 0 이상의 숫자를 간단하게 나타낼 수 있습니다.
^^
- 파일의 시작 - 파일의 시작 위치에 지정된 텍스트가 나올 경우입니다. 소스 코드 또는 텍스트 파일에서 텍스트를 검색할 때만 사용할 수 있습니다. 예를 들어 파일의 시작 위치에 나오는 첫 번째 HTML 태그를 검색하려면 정규식 ^^를 사용합니다.
$$
- 파일의 끝 - 파일의 끝 위치에 지정된 텍스트가 나올 경우입니다. 소스 코드 또는 텍스트 파일에서 텍스트를 검색할 때만 사용할 수 있습니다. 예를 들어 파일의 끝에 나오는 마지막 HTML 태그(태그 다음에 공백이 없는 경우)를 검색하려면 정규식 $$를 사용합니다.
Pattern Modifiers(패턴 변경자) :
http://kr2.php.net/manual/kr/reference.pcre.pattern.modifiers.php
i (PCRE_CASELESS)
이 변경자를 지정하면, 패턴의 문자는 대문자와 소문자를 구별하지 않습니다.
m (PCRE_MULTILINE)
기본적으로, PCRE는 주어진 문자열을 하나의 "줄"로 취급합니다. (실제로 몇개의 라인을 가지더라도) "줄 시작" 메타문자(^)는 문자열의 처음만을 인식하며, "줄 끝" 메타문자($)는 문자열의 끝이나 (D 변경자가 지정되지 않는 한) 마지막 뉴라인의 직전만을 인식합니다. 이는 펄과 같습니다. 이 변경자를 지정하면, "줄 시작"과 "줄 끝"은 주어진 문자열의 모든 뉴라인 직후와 직전을 인식합니다. respectively, as well as at the very start and end. 이는 펄의 /m 변경자와 동일합니다. 주어진 문자열에 "\n" 문자가 존재하지 않거나 ^나 $ 패턴이 일어나지 않으면 이 변경자는 아무런 효과가 없습니다.
s (PCRE_DOTALL)
이 변경자가 지정되면, 패턴의 점 메타문자는 뉴라인을 포함하는 모든 문자를 인식합니다. 지정하지 않으면, 뉴라인은 제외됩니다. 이 변경자는 펄의 /s 변경자와 동일합니다. [^a]와 같은 부정클래스는 이 변경자에 관계 없이 항상 뉴라인 문자를 포함합니다.
x (PCRE_EXTENDED)
이 변경자가 지정되면, 공백 문자는 이스케이프 되거나 문자 클래스 안에 있을 경우를 제외하고, 완전히 무시합니다. 문자 클래스 밖에서 이스케이프 되지 않은 # 사이와 뉴라인 문자 다음의 문자도 무시합니다. 이는 펄의 /x 변경자와 같고, 복잡한 패턴 안에 코멘트를 사용할 수 있게 합니다. 그러나 이는 데이터 문자에만 해당하는 점에 주의하십시오. 공백 문자는 패턴의 특별한 문자 시퀀스 안에는 존재할 수 없습니다. 예를 들면, 조건 서브 패턴을 나타내는 (?( 시퀀스에는 나와서는 안됩니다.
e (PCRE_REPLACE_EVAL)
이 변경자를 지정하면, preg_replace()는 변경할 문자열을 PHP 코드로 처리하고, 그 결과를 검색된 문자열의 이용하여 일반적인 치환을 합니다. 작은 따옴표, 큰 따옴표, 백슬래시와 NULL 문자는 백슬래시로 이스케이프됩니다. preg_replace()만 이 변경자를 사용합니다; 다른 PCRE 함수는 무시합니다.
A (PCRE_ANCHORED)
이 변경자를 지정하면, 패턴을 강제적으로 "고정"합니다. 이는 ("주어진 문자열"에서) 검색된 문자열의 시작에만 매치도록 강제합니다. 패턴 자체에서 특정한 구조를 가지게 하는, 펄에서는 유일한 방법으로 같은 효과를 얻을 수
D (PCRE_DOLLAR_ENDONLY)
이 변경자가 설정되면, 패턴의 달러($) 메타문자는 주어진 문자열의 마지막에만 대응합니다. 이 변경자 없이는, 달러는 마지막 문자가 뉴라인일 경우에는 바로 직전의 문자에도 매칭합니다. (마지막이 아닌 뉴라인은 제외합니다) 이 변경자는 m 변경자가 지정되었을때는 무시됩니다. 펄에는 이 변경자가 존재하지 않습니다.
S
패턴이 여러번 이용되면, 매칭에 걸리는 시간을 절약하기 위해서 분석에 더 많은 시간을 들일 가치가 있습니다. 이 변경자를 지정하면, 추가 분석을 행합니다. 현 시점에서, 패턴의 분석은 하나의 고정된 시작 문자를 가지지 않는 비고정 패턴에만 유용합니다.
U (PCRE_UNGREEDY)
이 변경자는 수량 지시의 "greediness"를 뒤집습니다. 그리하여 기본값으로 not greedy하게 합니다. 하지만 "?"가 붙으면 greedy하게 됩니다. 이는 펄과 호환되지 않습니다. 패턴 안에서 변경자 설정으로 (?U)처럼 지정하거나, 수량지시어 뒤의 물음표로 지정할 수 있습니다. (예. .*?)
X (PCRE_EXTRA
이 변경자는 펄과 호환되지 않는 PCRE의 추가 기능을 사용하게 합니다. 패턴의 문자와 결합된 백슬래시가 특별한 의미를 지니지 않을 경우에 에러를 발생시켜서, 차후에 추가 기능을 위해 예약해둡니다. 기본적으로 펄은, 문자와 결합된 백슬래시가 특별한 의미를 지니지 않을 경우에는 글자로 취급합니다. 이 변경자는 다른 기능을 제어하지 않습니다
J (PCRE_INFO_JCHANGED)
내부 옵션 (?J) 설정은 영역의 PCRE_DUPNAMES 옵션을 변경합니다. 서브패턴에 동일한 이름을 허용합니다.
u (PCRE_UTF8)
이 변경자는 펄과 호환되지 않는 PCRE의 추가 기능을 사용하게 합니다. 패턴 문자열을 UTF-8으로 취급합니다. 유닉스에서는 PHP 4.1.0부터, win32에서는 PHP 4.2.3부터 사용할 수 있습니다. PHP 4.3.5부터 패턴의 UTF-8 유효성이 검사됩니다.
아주간단한 예를 보면서 기본적인 몇개를 처리해보자
$str = "shop-wiz.com"; 

$result = preg_match ("/^sh/", $str);//result : 1 (문장의 첫 단어가 sh로 시작
$result = preg_match ("/^ho/", $str);//result : 0


$result = preg_match ("/om$/", $str);//result : 1 (문장의 마지막이 om로 끝남
$result = preg_match ("/co$/", $str);//result : 0

$result = preg_match ("/w.z/", $str);//result : 1 (문장의 중간에 w로 시작하고 특정한문자 하나있고 z다되는 단어
$result = preg_match ("/w.i/", $str);//result : 0

$result = preg_match ("/[^0-9]/", $str);//result : 1 
$result = preg_match ("/[0-9]/", $str);//result : 0

$result = preg_match ("/w*z/", $str);//result : 1
$result = preg_match ("/w*i/", $str);//result : 1 상기 예인 "."과 차잇점
$result = preg_match ("/w*m/", $str);//result : 1 (여러개의 문자도 ok)
$result = preg_match ("/w*a/", $str);//result : 0 

$result = preg_match ("/shop|Shop|SHOP/", $str);//result : 1
<?

	## 예제샘플 - 네이버의 포스트 불러와서 대표이미지 가져오기
	$pattern = "/http:\/\/(blogfiles|postfiles|cafefiles|cfile).*\.(jp[e]?g|gif|png).*[\s | \\\" | \\\']/Ui";
	$url = "http://blog.naver.com/PostView.nhn?blogId=".$naver_return_key[3]."&logNo=".$naver_return_key[4];
	$contents = file_get_contents($url);
	preg_match_all($pattern, $contents, $match);
	foreach($match[0] as $key => $val) {
		$val = substr($val, 0, -1);
	}
?>
	
패턴설명
/http:\/\/(blogfiles|postfiles|cafefiles|cfile).*\.(jp[e]?g|gif|png).*[\s | \\\" | \\\']/Ui

/http : http로 시작한다.
\/\/ : "//"가 연속되며
(blogfiles|postfiles|cafefiles|cfile).* : blogfiles 이나 postfiles 이나 cafefiles 이나 cfile 로 되는 문자열 이후로 모든 문자열이 계속된다.
\.(jp[e]?g|gif|png) : "."문자이후에 pg "e"가 0또는 1회 존재하며 g인 문자 혹은 gif 혹은 png 의 문자가 나오고
.* : 다시 줄바꿈을 제외한 모든 문자가 다수 혹은 안나오면서
[\s | \\\" | \\\']/: 문자의 마지막"/"은 공백이거나 "이거나 '인 문자를
Ui : 대소문자 구별없이 자른다. 이부분은 하기 예제와 함께 설명된 패턴 변경자의 특징을 보시기 바란다.

아래는 문서중 URL을 찾아 링크를 시키는 것이다.
$text = "Click My URL :  http://www.shop-wiz.com";
$text = ereg_replace("[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]","\\0", $text);
echo $text;
[[:alpha:]] -> 알파벳으로 된 문자가
+ -> 1개이상
:// ->"://" 문자가 존재하고
[^<>[:space:]] -> "<" 와 ">" 와 공백이 아닌 문자가
+ -> 1개이상이고
[[:alnum:]/] -> 숫자와 문자로 이루어진 것이 끝까지 가는 것(공백 및 특수 문자를 만날때까지 진행)
\\0\ -> 조건에 해당하는 문자가 들어간다.
만약 "()"가 존재하면 그 해당하는 서브패턴을 찾을 경우 \\0\, \\1\, \\2\ ... 로 처리된다.

 <?php
	preg_match_all("|<[^>]+>(.*)</[^>]+>|U",
	"<b>example: </b><div align=left>this is a test</div>",
	$out, PREG_PATTERN_ORDER);
	echo $out[0][0] . ", " . $out[0][1] . "\n";
	echo $out[1][0] . ", " . $out[1][1] . "\n";
	?>
example: ,
this is a test
example: , this is a test

$subject ="
	<body> 
	PHP 정규식 샘플 페이지 입니다.
	<br /> 
	<a href=\"http://www.shop-wiz.com.com\">SHOP-WIZ.COM</a>쇼핑몰솔루션입니다.<br /> 
	<a href=\"mailto:master@shop-wiz.com\">문의사항은 이곳으로</a><br />
	좀더 새로운 모습으로 인사드리겠습니다.
	<a href=\"http://www.shop-wiz.com\">홈</a>
	</body>
	";

'샘플'과 일치하는 갯수 : 1
.과 일치하는 갯수 :10
shop-wiz.com 일치하는 갯수: 3
shop-wiz.com 일치하는 갯수: 4
a href=""와 일치하는 갯수
3
메치한는 첫 단어출력
a href="http://www.shop-wiz.com.com"
메치한는 첫 단어출력
http://www.shop-wiz.com.com
메치한는 둘 단어출력
a href="mailto:master@shop-wiz.com"
메치한는 둘 단어출력
mailto:master@shop-wiz.com PHP 정규식 샘플 페이지 입니다.
http://SHOP-WIZ.COM쇼핑몰솔루션입니다.
문의사항은 이곳으로
좀더 새로운 모습으로 인사드리겠습니다.

서브 패턴()
서브 패턴의 역활에 대해서 알아보겠습니다.
서브 패턴은 () 안에 들어가 있는 것인데 상기 예에서는 (.*) 입니다.
좀더 상세한 패턴 형식을 구할때 사용되는데 preg_match_all($pattern, $string, $matches); 와 같이 사용될때 $matches에는 각각의 결과가 저장됩니다.
$matches[0] 에는 전체 패턴에 대한 값이 들어가고 이후 $matches[1]... 부터는 서브패턴의 수만큼 결과값이 저장됩니다.

아래는 다음에 자세한 설명을 드릴 url을 구하는 정규식인데 각각의 결과를 보시면서 서브패턴과 결과가 어떻게 달라지는지 보실 수 있습니다.
$str = "숍위즈 네이버다음";
preg_match_all("/]* href=(['|\"]*)([^\\1\040>]*)\\1[^>]*>/is", $str, $matches); 
print_r($matches); 
$str = "http://www.shop-wiz.com 숍위즈 http://www.naver.com 네이버 http://www.daum.net 다음";
preg_match_all("/(http|mms|ftp|telnet):\/\/[-a-z0-9]+(\.[-a-z0-9]+)/is", $str, $matches); 
print_r($matches); 

Array
(
[0] => Array
(
[0] => <a href='http://www.shop-wiz.com'>
[1] => <a href='http://www.naver.com'>
[2] => <a href='http://www.daum.net'>
)

[1] => Array
(
[0] => '
[1] => '
[2] => '
)

[2] => Array
(
[0] => http://www.shop-wiz.com
[1] => http://www.naver.com
[2] => http://www.daum.net
)

)


Array
(
[0] => Array
(
[0] => http://www.shop-wiz
[1] => http://www.naver
[2] => http://www.daum
)

[1] => Array
(
[0] => http
[1] => http
[2] => http
)

[2] => Array
(
[0] => .shop-wiz
[1] => .naver
[2] => .daum
)

)


두개가 결과는 다르지만 비슷한 결과를 출력하는데 matches[0]에는 전체 정규식 결과가 출력되고 현재 서브패턴("()")이 두개가 있으므로 이후 배열 matches[1], matches[2]에는 서브패턴된 각각의 값이 들어가는 것을 보실 수 있습니다.

Pattern Modifiers(패턴 변경자)의 실예
## u (PCRE_UTF8)
 <?php
	$str = '한글 english どをウィ 中國 #&*§※☆★';
	preg_match_all('/./u', $str, $match );
	echo print_r($match);
	?>
결과 :   Array ( [0] => Array ( [0] => 한 [1] => 글 [2] => [3] => e [4] => n [5] => g [6] => l [7] => i [8] => s [9] => h [10] => [11] => ど [12] => を [13] => ウ [14] => ィ [15] => [16] => 中 [17] => 國 [18] => [19] => # [20] => & [21] => * [22] => § [23] => ※ [24] => ☆ [25] => ★ ) )

<?
	$pattern = "/p.*p/";
	$contetns = "apple, orange, p p, kk poPartist 팝아티스트"; 
	preg_match_all($pattern, $contetns, $match);
	print_r($match);
	?>
	
결과 : Array ( [0] => Array ( [0] => pple, orange, p p, kk p ) )
현재 주어진 문장을 읽어 문장에서 맨처음 나오는 p와 맨나중에 나오는 p사이의 모든 문장을 읽어들인다.

<?
	$pattern = "/p.*p/";
	$contetns = "apple, orange, p p, kk poPartist 팝아티스트\n나의 이름은 product 이다.";
	preg_match_all($pattern, $contetns, $match);
	print_r($match);
	?>
결과 : Array ( [0] => Array ( [0] => pple, orange, p p, kk p [1] => product pop ) )
두번째 줄에 다른 문장이 하나더 들어갔다.
결과 처럼 문장별로 새로운 배열결과가 출력됨을 확인할수 있다.

<?
	$pattern = "/p.*p/U";
	$contetns = "apple, orange, p p, kk poPartist 팝아티스트 나의 이름은 product pop 이다.";
	preg_match_all($pattern, $contetns, $match);
	print_r($match);
	?>
결과 : Array ( [0] => Array ( [0] => pp [1] => p p [2] => poPartist 팝아티스트 나의 이름은 p [3] => pop ) )
패턴 변경자인 U를 추가하였다. U를 설명할때 "not greedy"라는 표현을 사용했는데 아마 이샘플을 보시면 그 의미를 아실 수 있을 것입니다. 문장의 라인별(\n)이 아니라 일치하는 구문구문을 모두 자른다는 것을 보실수 있습니다.

<?
	$pattern = "/p.*p/U";
	$contetns = "apple, orange, p p, kk poPartist 팝아티스트\n나의 이름은 product pop 이다.";
	preg_match_all($pattern, $contetns, $match)
	print_r($match);
	?>
결과 : Array ( [0] => Array ( [0] => pp [1] => p p [2] => product p ) )
바로위 패턴과 비교하여 \n(줄바꿈이 하나더 들어갔다)
예상을 했나요? 그렇습니다. 정규식에서 \n은 연속이 아니라 단절을 의미합니다. 즉 다음라인에서부터 처음부터 새로이 검색을 하는 거죠.

<?
	$pattern = "/p.*p/Ui";
	$contetns = "apple, orange, p p, kk poPartist 팝아티스트";
	preg_match_all($pattern, $contetns, $match);
	print_r($match);
	?>
결과 : Array ( [0] => Array ( [0] => pp [1] => p p [2] => poP ) )
i는 대소문자를 구분하지 않습니다. 현재 결과와 같이 poP의 P대문자도 같이 인식을 하게 됩니다.

<?
	$pattern = "|p.*p|U";
	$contetns = "apple, orange, p p, kk poPartist 팝아티스트\n나의 이름은 product pop 이다.";
	preg_match_all($pattern, $contetns, $match);
	print_r($match);
?>
결과 : Array ( [0] => Array ( [0] => pp [1] => p p [2] => product p ) )
또다른 예로 기존에 설명드린예에서 "/" 대신에 "|"을 사용해 보았습니다. 결론은 같지요. 그런데 왜 다르게 사용할까요? 그것은 저도 모름.^^ 어디서 설명서를 봐야한는데. 찾는 대로 다시 업데이트 하겠습니다.
http://www.php.net/manual/en/regexp.reference.delimiters.php
결국 "/"은Delimiters 에 속하고 | 은 정규식 표현중에 하나죠
PCRE 함수를 사용할 경우 Delimiters에 감싸줘야 한다고 나와 있네요

//연속된 두개의 공백을 하나로 바꾸는 스크립트
$str = "this is       my   new face ";
$str = preg_replace("/\s+/"," ",$str); 
//iframe 제거

 $STRING = preg_replace("!!is","",$STRING);
 

 //script 제거

 $STRING = preg_replace("!!is","",$STRING);
 

 //meta 제거

 $STRING = preg_replace("!!is","",$STRING); 
 

 //style 태그 제거

 $STRING = preg_replace("!!is","",$STRING); 
 

 // 를 공백으로 변환

 $STRING = str_replace(" "," ",$STRING);
 

 //연속된 공백 1개로

 $STRING = preg_replace("/\s{2,}/"," ",$STRING);
 

 //태그안에 style= 속성 제거

 $STRING = preg_replace("/ style=([^\"\']+) /"," ",$STRING); // style=border:0... 따옴표가 없을때
 $STRING = preg_replace("/ style=(\"|\')?([^\"\']+)(\"|\')?/","",$STRING); // style="border:0..." 따옴표 있을때
 

 //태그안의 width=, height= 속성 제거

 $STRING = preg_replace("/ width=(\"|\')?\d+(\"|\')?/","",$STRING);
 $STRING = preg_replace("/ height=(\"|\')?\d+(\"|\')?/","",$STRING);
 

 //img 태그 추출 src 추출

 preg_match("/]*src=[\"']?([^>\"']+)[\"']?[^>]*>/i",$STRING,$RESULT);
 preg_match_all("/]*src=[\"']?([^>\"']+)[\"']?[^>]*>/i",$STRING,$RESULT);


	//src뒤에 "http 또는 'http 또는 http로 시작하지 않는 경우에만 $path를 삽입합니다.
 
	$path="http://www.naver.com";
	$body="";
	$body=preg_replace("/

Powered by shop-wiz since 2002, e-mail:wangta69@naver.com