정규표현식
정규표현식이란?
문자열에서 특정한 규칙을 가지는 문자열의 집합을 찾아내기 위한 검색 패턴.
검색 패턴으로 문자열 검색이나 교체등의 작업에 사용할 수 있다.
php에는 2가지의 정규 표현식이 있다.
1.POSIX
2.PCRE
POSIX이 배우기 쉽고 실행속도가 빠르다.
PCRE는 POSIX 정규 표현식을 확장했기 때문에 더 강력하고 유연하게 동작.
[POSIX]
정규표현식 리터럴
문법은
/검색패턴/플래그
형식이다.
슬래시(/)로 시작해서 슬래시(/)로 끝난다.
preg_match함수
해당 문자열에서 전달 받은 정규표현식과 일치하는 패턴을 검색한다.
preg_match($pattern,$subject [,$matches]); //[ ]는 선택사항이다.
첫 번째 인자로 정규표현식에 해당하는 패턴을 받고
두 번째 인자로 검색할 문자열을 전달한다.
검색 결과는 배열로 반환되며 세 번째 인자로 반환값이 직접 전달되기도 한다.
preg_match함수는 정규 표현식에 해당하는 패턴이 검색되면, 더는 검색하지 않고 검색을 중단한다.
일치하는 패턴이 존재하면 1을 반환하고, 존재하지 않으면 0을 반환.
preg_match_all함수
문자열에서 찾을 패턴에 맞는 모든 패턴을 리턴해줌.
※preg_match와의 차이점은 preg_match는 한개만 반환하지만 preg_match_all은 모든 패턴을 리턴한다.
단순 패턴 검색
정규표현식을 사용하여 단순한 문자열을 검색하고자 할 때는 문자열을 직접 나열하면 된다.
ex)
$subject="간장 공장 공장장은 강 공장장이고, 된장 공장 공장장은 장 공장장이다.";
if(preg_match('/공장/',$subject){
echo "공장있음";
}else { echo "공장 없음";}
플래그
찾을 패턴을 작성할 때 플래그를 사용하여 기본 검색 설정을 변경할 수 있다.
문자 |
의미 |
i |
검색 패턴을 비교할 때 대소문자를 구분하지 않도록 설정 |
g |
검색 패턴을 비교할 때 일치하는 모든 부분을 선택하도록 설정 |
m |
검색 패턴을 비교할 때 여러 줄의 입력 문자열을 그 상태 그대로 여러 줄로 비교하도록 설정. |
y |
대상 문자열의 현재 위치부터 비교를 시작하도록 설정. |
u |
대상 문자열이 utf-8로 인코딩된 것으로 설정. |
ex)
$subject="ABabaabbAABB";
$preg=preg_match("/AB/gi",$subject); //일치하는 모든 부분을 대소문자 구분없이 출력
echo $freg; //AB,ab,AB 출력
정규 표현식
문자 |
의미 |
예제 |
. |
임의의 한 문자 |
/.ap/ -> aap bap cap @ap %ap |
* |
바로앞의 문자를 의미하고 해당문자가 0번이상 존재하는 문자 |
/a*p/ -> p ap aap aaap |
+ |
바로 앞의 문자가 1번 이상 나타날 경우를 검색 |
s+k -> sk ssk sssk |
? |
바로앞의 문자를 의미하고 0번 또는 1번만 나타나는 경우 |
ex?e -> ee exe |
^ |
바로앞의 문자를 의미하고 그 문자로 시작됨 | ^the -> the boy |
$ |
해당문자로 끝나는 것을 의미 |
$bc ->abc |
[] |
대괄호 안의 문자열중 하나의 문자를 의미 |
[a-z] -> 알파벳 중 하나 |
{} |
앞에 있는 문자 또는 문자열의 개수 |
a{2,4}B(a가 2번이상 4번 이하로 나타나는 경우) -> aaB aaaB aaaaB |
() |
괄호 안의 문자열을 그룹화 |
A(BC){2} A뒤에 BC가 두번이상나타나는 문자열 |
| | or 연산자, 여러개를 검색할 수 있다 | preg_match_all('/abc|def|ghi/',$subject); |
※정규표현식의 특수문자를 문자자체로 인식되게 사용할 경우에는 \를 붙임.
<p class="no_today"></p>
$rex="/\<p class=\"no_today.+\">(.+)\<\/p>/";
<em class="no_up">~~</em>
$rex = "/\<em class=\"no_.+\"\>(.*)\<\/em\>/";