본문 바로가기
PHP

[PHP] 정규 표현식 메소드 사용법

by teamnova 2024. 1. 1.

오늘은 이전에 공부했던 정규 표현식을 PHP에서 제공하는 메소드를 통해 활용해 보겠습니다.

https://stickode.tistory.com/1029

 

먼저 정규식과 같이 사용할 수 있는 메소드들입니다.

// $subject 문자열 안에서 정규 표현식 방식을 사용한 $pattern과 일치하는 것을 검색합니다.
// 검색된 결과 값은 결과 값을 저장할 변수인 $matches를 매개변수로 입력했다면 $matches에 저장합니다.(최초 한번만 적용)
// 패턴과 일치하는 문자열이 발견된다면 1을 반환하고 발견하지 않는다면 0을 반환합니다.
preg_match($pattern, $subject [,$matches]);


// preg_match 와 비슷하지만 패턴이 매칭된 개수를 반환하고
// 매개변수에 $matches를 입력했다면 각 매칭된 결과 값들을 배열로 만들어 반환한다.
preg_match_all($pattern, $subject, [,$matches]);


// 주어진 $subject 문자열에서 $pattern과 일치하는 문자열들을 $replacement로 변경한다.
// $limit과 $count는 선택적으로 입력할 수 있는 변수들로 $limit은 대체할 횟수를 의미한다.
// 기본으로 -1로 설정되어 있는데 이는 제한없음을 뜻한다.
// $count의 경우 $limit을 입려했을 때 선택적으로 입력할 수 있는 매개변수로 대체된 횟수를 저장한다.
// $subject에 문자열 배열도 넣을 수 있는 데 이럴 때는 변경된 문자열 배열을 반환하고
// 보통은 변경된 문자열 하나를 반환한다.
preg_replace($pattern, $replacement, $subject [, int $limit = -1 [, int &$count ]]);


// preg_replace 와 비슷하지만 대체할 문자열을 동적으로 생성하기 위해 사용한다.
preg_replace_callback("$pattern", function($matches) { return $replacement; }, $subject);


// 해당 메소드는 preg_replace와 비슷하나 $subject에 문자열 배열을 넣었을 때
// 패턴과 일치해 대체된 문자열들만 배열로 만들어 반환거나 단일 문자열일 때는 변경되었으면 해당 문자열을 반환한다.
preg_filter ($pattern, $replacement, $subject [, int $limit = -1 [, int &$count ]]);


// 해당 메소드는 $pattern을 기준으로 문자열을 나눠서 배열을 반환하는 메소드입니다.
// $limit는 반환된 배열의 크기를 지정하고 기본 값으로 -1 즉 제한없음으로 설정됩니다.
// $flags에는 총 3가지(PREG_SPLIT_NO_EMPTY, PREG_SPLIT_DELIM_CAPTURE, PREG_SPLIT_OFFSET_CAPTURE)가 있습니다.
// 이는 각각 비어있지 않은 값만 있는 배열 반환, 패턴도 같이 반환, 패턴을 기준으로 나눈 배열과 나눈 값과 그 값의 시작 인덱스도 하나로 묶어서 반환하는 방식이다.
preg_split($pattern, $subject [, int $limit = -1 [, int $flags = 0 ]]);

 

더 다양한 메소드가 있지만 오늘은 preg_match()와 preg_replace()관련 예제 코드를 보여드리겠습니다.

<?php

// 지역주소 예시
$str = "부산광역시 연제구 (연산 1동) 158-77";
//preg_match("/\(\S+\)/",$str,$matches);
//preg_match("/\([^\s]+\)/",$str,$matches); // \S 는 [^\s] 와 같다.
preg_match("/\(.*\)/",$str,$matches); // 괄호 시작과 종료안에서 .* 임의의 문자를 0개 이상 찾는다.

echo $matches[0]."<br />";
echo str_replace(array('(',')'),"",$matches[0]).'<br />';
##########################################
// 사이트 주소 예시
$str2 =  "http://www.naver.com";
// https? : http 또는 https
// /^(((http(s?))\:\/\/)?)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(\/\S*)?$/
if(preg_match("/^(((http(s?))\:\/\/)?)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(\/\S*)?$/"), $str2);

// 전화번호 예시
$mobileNO = "010-1234-7777";
$mobileNO = preg_replace("/\D/", "", $mobileNO); // 숫자가 아닌 모든 문자는 제거하라.
$mobileNO = preg_replace("/(^01[0|1|6|7|8|9]{1})([0-9]{3,4})([0-9]{4})$/", "\\1-\\2-\\3", $mobileNO);
echo $mobileNO.'<br />';
// [] : []안에 있는 문자열 중 한문자
// () : ()안에 있는 문자들의 그룹화
// {} : {} 바로 앞에 있는 문자열(또는 문자)의 개수
// ^01 : 시작을 01로 시작하고 0,1,6,7,8,9 중 1개의 글자를 그룹화하라.
// ([0-9]{3,4}) : 숫자 0~9 중 3개 또는 4개를 그룹화하라.
// ([0-9]{4}) : 숫자 0~9 중 4개를 그룹화하라.
 
 
이미지 다운로드시 상위 폴더로 이동하기 위한 ../ 정보가 포함되어 있는 걸 방지
$str ="../../image.png";$str=preg_replace("/\.{2}\//","",$str);echo $str.'<br/>';
 
$url ="http://www.naver.com/index.php";
preg_match("/^(https?:\/\/)?([^\/]+)/i",$url,$matches);
// ^ 시작이 http:// 또는 https:// 로 시작하는 문자열이 ? (0 또는 1개)
// ?는 바로 앞에 있는 괄호의 반복()을 의미한다.
// ? : 0개 또는 1개
// + : 1개 이상
// [^\/] : /가 아닐 때까지 +(1개 이상) 즉, /를 만날때까지의 값
echo '<pre>';
print_r($matches);
echo '</pre>';
 
공백이 2칸 이상일 때 1칸으로 변경
$str ="I'm a office    worker.";
$str=preg_replace("/\s{2,}/"," ",$str);
// 연속된 공백을 1개의 공백으로 변경
echo $str.'<br/>';
// \s{2,} : 공백이 2개 이상이면
 
$str ="주석이전 내용;
// 주석 처리할 내용";
$str = preg_replace('/\/\/([^\n]+)/', "", $str); // (.*) 과 ([^\n]+) 는 같다.
// //부터 시작하여 개행문자까지 모두 공백으로 처리하라.
echo $str.'<br />';
 
$str ="<!--홍길동-->";
preg_match("/--([^--]+)/",$str,$matches);
// -- 부터 시작해서 --를 만날때까지의 값 추출
echo '<pre>';
print_r($matches);
echo '</pre>';
 
?>

 

여기까지이고 다음에는 오늘 사용하지 않은 메소드들과 새로운 메소드들로 예제를 만들어 보겠습니다.