이런거 궁금했니

  • 이런거 궁금했니

코딩preg_match에 관한 정규식 올려봅니다.

정규표현식

위치와 이스케이핑
^who -> 맨 앞 who 찾기
who$ -> 맨 뒤 who 찾기
$ -> $ 찾기
^$ -> 맨 앞 $ 찾기
$$ -> 맨 뒤 $ 찾기
-> 찾기
모든 문자 그룹
. -> 어떠한 문자 모두를 가리킴
...... -> 문자 6덩어리를 가리킴
. -> . 찾기
... -> .(any character). 찾기
특정 문자 범위
[oyu] -> o or y or u 찾기
[dH]. -> d(any character) or H(any character) 찾기 -> dy, HH, do ... 등등
[owy][yow] -> ow, oy, ww, ... (문자 2개 찾기)
[C-K] -> C부터 K 범위에 있는 알파벳 문자 1개 찾기 -> [CDEFGHIJK]와 같은 의미.
[a-d] -> a부터 d까지
[2-6] -> 2부터 6까지
[C-Ka-d2-6] -> C~K or a~d or 2~6 사이인 문자 1개 찾기
[^CDghi45] -> C, D, g, h, i, 4, 5가 아닌 문자 찾기 -> ^가 []안에 쓰이면 부정의 의미
[^W-Z] -> W, X, Y, Z가 아닌 문자 찾기
서브패턴
(on|ues|rida) -> 문자열에서 on이거나 ues이거나 rida인 부분 찾기
(Mon|Tues|Fri)day -> Monday이거나 Tuesday이거나 Friday인 부분 찾기
..(id|esd|nd)ay -> 문자 2개 아무거나와 ay사이가 id이거나 esd이거나 nd인 부분 찾기
수량자
a*b -> 문자열에서 a가 0 ~ 여러개이고 뒤에 b가 붙는 부분 찾기 -> b, ab, aab, aaab 찾아짐.
a+b -> b 앞에 a가 1개 이상인 부분 찾기
a?b -> b 앞에 a가 없거나 1개인 부분 찾기
[-@]* -> [] 후보군에 속하는 문자가 없거나 여러개인 부분 찾기 -> -@-, --
*+ -> *이 1개 이상인 부분
-@+- -> 앞과 뒤가 -이고, @가 1개 이상인 부분 찾기 -> -@-, -@@-, -@@@-, ...
[^ ]+ -> 공백이 아닌 것이 1개 이상인 부분 찾기
-X?XX?X -> -XX, -XXXX, -XXX
-@?@?@?- -> --, -@-, -@@-, -@@@-
.{5} -> 어떠한 문자이던간에 5글자 선택하기
[els]{1,3} -> e또는 l또는 s 조합으로 1~3개 문자만 선택 -> e, ee, el, ess
[a-z]{3,} -> a부터 z까지 문자의 조합 중 3개 이상인 부분 선택
AB*A == AB{0,}A
AB+A == AB{1,}A
AB?A == AB{0,1}A
r.* -> r, rfjdaklsfjslk, riinlk dkfjls (공백도 다 선택됨.)
r.*? -> r만 가능 -> 수량자 뒤에 ?가 오면 해당 수량자가 가질 수 있는 최소 수를 선택하게 됨.
r.+? -> rx, rd, rb, rq, rr
r.?? -> r만 가능
경계
w -> word(알파벳, 숫자, _)만 선택
w == [A-z0-9_]
W -> word가 아닌 것 선택
d -> 숫자만 선택
D -> 숫자가 아닌 것 선택
b -> 단어 boundary
bw -> 단어의 첫 글자 선택
wb -> 단어의 마지막 글자 선택
bwb -> 단어의 길이가 1인 단어 선택
bw+b -> 단어 별로 선택됨.
B.B -> 단어 경계(앞, 뒤)를 제외한 나머지 선택됨.
A -> 단어 경계의 시작점을 가리킴 (글자 가리키지 않음.)
A... -> 시작 경계로부터 글자 3개
...Z -> 끝 경계로부터 글자 3개

<?php
// php에서는 정규표현식을 /(정규표현식)/(pattern modifier) 으로 작성한다.
// match 되는 부분 있으면 1, 없으면 0 리턴
//
// pattern modifier
// i: 패턴 매칭을 할 때, 대소문자를 구분하지 않도록 한다.
// m: 멀티라인으로 작동. (^나 $를 여러줄에서 사용할 때, match되는 부분들 중 맨 앞/맨 뒤에만 적용됨.)
if (preg_match("/php/i", "PHP is the web scripting language of choice.")) {
// PHP에서 걸림. -> match -> 1 리턴.
echo "A match was found. (1)<br>";
} else {
echo "A match was not found. (1)<br>";
}


// b는 단어의 경계를 의미한다. 그렇기 때문에 b로 감싸진 web은 web이라는 독립된 단어를 의미한다. website는 이 조건에 해당하지 않는다.
if (preg_match("/bwebb/i", "PHP is the web scripting language of choice.")) {
echo "A match was found. (2)<br>";
} else {
echo "A match was not found. (2)<br>";
}

if (preg_match("/bwebb/i", "PHP is the website scripting language of choice.")) {
echo "A match was found. (3)<br>";
} else {
echo "A match was not found. (3)<br>";
}


$subject = 'coding everybody http://opentutorials.org egoing@egoing.com 010-0000-0000';
preg_match('/(http://w+.w+)s(w+@w+.w+)/', $subject, $match);
echo '<pre>';
var_dump($match);
echo '</pre>';

echo "homepage: " . $match[1] . '<br>';
echo "email: " . $match[2] . '<br>';



// get host name from url
// ?: 을 붙여줌으로써 해당 부분이 match2 배열에 담기지 않도록
preg_match("/^(?:http://)?([^/]+)/i", "http://www.php.net/index.html", $match2);

echo '<pre>';
var_dump($match2);
echo '</pre>';

$host = $match2[1]; // www.php.net

// get last two segments of host name
preg_match("/[^.]+.[^.]+$/i", $host, $match3);
echo "domain name is: {$match3[0]}";



// back reference 지정
// key로 꺼내올 수 있음.
$str = 'foobar: 2008';
preg_match('/(?P<name>w+): (?P<digit>d+)/i', $str, $match4);

echo '<pre>';
var_dump($match4);
echo '</pre>';



// preg replace 1
$string = 'April 15, 2003';
$pattern = '/(w+) (d+), (d+)/i';
$replacement = '${1}1, $3'; // $1, ${1} 첫번째 서브패턴 값인데, ${1}은 다른문자와 섞어 쓸 때 사용
echo preg_replace($pattern, $replacement, $string);



// preg replace 2
$string2 = 'The quick brown fox jumped over the lazy dog.';
$patterns = array();
$patterns[0] = '/quick/';
$patterns[1] = '/brown/';
$patterns[2] = '/fox/';
$replacements = array();
$replacements[2] = 'bear';
$replacements[1] = 'black';
$replacements[0] = 'slow';
echo preg_replace($patterns, $replacements, $string2);



// preg replace 3
$patterns = array(
'/(19|20)(d{2})-(d{1,2})-(d{1,2})/',
'/^s*{(w+)}s*=/'
);
$replace = array(
'3/4/12',
'$1 ='
);
echo preg_replace($patterns, $replace, '{startDate} = 1999-5-27'); // $startDate = 5/27/1999

파일없음

댓글