정규 표현식의 활용
정규 표현식의 활용
앞서 살펴본 정규 표현식을 활용하면, 다음과 같은 데이터가 해당 형식에 맞는지를 손쉽게 확인할 수 있습니다.
1. 전화번호
2. 이메일 주소
전화번호 확인
정규 표현식을 이용하면 해당 전화번호가 유효한 형식의 전화번호인지를 확인할 수 있습니다.
정규 표현식
① /^[[:digit:]]{2}\-[[:digit:]]{4}\-[[:digit:]]{4}/ // 02-1234-5678, ...
② /^[[:digit:]]{2,3}\-[[:digit:]]{3,4}\-[[:digit:]]{4}/ // 02-1234-5678, 031-123-5678, 010-1234-5678, ...
①번 정규 표현식은 전화번호의 맨 앞자리가 2자리이고, 국번이 4자리인 전화번호만을 검색할 수 있습니다.
하지만 지역번호나 핸드폰의 경우에는 전화번호의 맨 앞자리가 3자리이며, 국번이 3자리인 전화번호도 아직 존재합니다.
따라서 ②번 정규 표현식과 같이 전화번호의 맨 앞자리가 2자리나 3자리이고, 국번도 3자리나 4자리인 전화번호까지 검색할 수 있도록 해야합니다.
예제
$tel = "02-1234-5678";
$cell = "010-1234-5678";
$pattern_01 = "/^[[:digit:]]{2}\-[[:digit:]]{4}\-[[:digit:]]{4}/";
if (preg_match($pattern_01, $tel, $matches_01)) {
var_dump($matches_01);
} else {
echo "{$tel}은 유효한 형식의 전화번호가 아닙니다.<br>";
}
if (preg_match($pattern_01, $cell, $matches_02)) {
var_dump($matches_02);
} else {
echo "{$cell}은 유효한 형식의 전화번호가 아닙니다.<br>";
}
$pattern_02 = "/^[[:digit:]]{2,3}\-[[:digit:]]{3,4}\-[[:digit:]]{4}/";
if (preg_match($pattern_02, $tel, $matches_03)) {
var_dump($matches_03);
} else {
echo "{$tel}은 유효한 형식의 전화번호가 아닙니다.<br>";
}
if (preg_match($pattern_02, $cell, $matches_04)) {
var_dump($matches_04);
} else {
echo "{$cell}은 유효한 형식의 전화번호가 아닙니다.<br>";
}
또한, '\'문자 바로 뒤에 특수 문자가 나오면, 해당 문자는 일반 문자로 인식됩니다.
위의 예제에서 사용된 '-'문자는 범위를 나타내는 특수 문자이므로, '\-'는 단순히 전화번호에서 사용되는 '-'기호로 인식됩니다.
이메일 주소 확인
전화번호뿐만 아니라 이메일 주소도 특정 형식을 가지고 있습니다.
따라서 정규 표현식을 이용하면 해당 이메일 주소가 유효한 형식의 이메일 주소인지를 확인할 수 있습니다.
해당 전화번호가 유효한 형식의 전화번호인지를 다음 정규 표현식을 이용하여 확인할 수 있습니다.
정규 표현식
① /([0-9a-zA-Z_-]+)@([0-9a-zA-Z_-]+)\.([0-9a-zA-Z_-]+)/ // help@abcd.com, ...
② /([0-9a-zA-Z_-]+)@([0-9a-zA-Z_-]+)(\.[0-9a-zA-Z_-]+){1,2}/ // help@abcd.com, help@abcd.co.kr, ...
위의 예제에서 사용된 다음 정규 표현식의 의미는 숫자나 영문 대소문자, 언더스코어(_) 또는 '-'기호를 포함한 문자가 1번 이상 반복되는 문자열을 의미합니다.
정규 표현식
[0-9a-zA-Z_-]+
①번 정규 표현식은 '@'문자와 '.'문자를 각각 하나씩만 포함하는 이메일 주소만을 검색합니다.
따라서 이 정규 표현식은 도메인 이름이 '.com'이나 '.net'과 같이 '.'문자를 하나만 포함하는 이메일 주소만 검색할 수 있습니다.
즉, 위의 예제처럼 '.'문자를 2개 이상 포함하는 이메일 주소는 정확하게 인식하지 못합니다.
그러므로 '.'문자를 2개 이상 포함하는 이메일 주소는 ②번 정규 표현식과 같이 좀 더 자세히 표현해야 합니다.
다음 정규 표현식은 '.'문자로 시작하고, 숫자나 영문 대소문자, 언더스코어(_) 또는 '-'기호를 포함한 문자가 1번 이상 반복되는 문자열이 1번 또는 2번 반복되는 문자열을 의미합니다.
정규 표현식
(\.[0-9a-zA-Z_-]+){1,2}
예제
$com = "help@abcd.com";
$co = "help@abcd.co.kr";
$pattern_01 = "/([0-9a-zA-Z_-]+)@([0-9a-zA-Z_-]+)\.([0-9a-zA-Z_-]+)/";
if (preg_match($pattern_01, $com, $matches_01)) {
var_dump($matches_01[0]);
} else {
echo "{$com}은 유효한 형식의 이메일 주소가 아닙니다.<br>";
}
if (preg_match($pattern_01, $co, $matches_02)) {
var_dump($matches_02[0]);
} else {
echo "{$co}은 유효한 형식의 이메일 주소가 아닙니다.<br>";
}
$pattern_02 = "/([0-9a-zA-Z_-]+)@([0-9a-zA-Z_-]+)(\.[0-9a-zA-Z_-]+){1,2}/";
if (preg_match($pattern_02, $com, $matches_03)) {
var_dump($matches_03[0]);
} else {
echo "{$com}은 유효한 형식의 이메일 주소가 아닙니다.<br>";
}
if (preg_match($pattern_02, $co, $matches_04)) {
var_dump($matches_04[0]);
} else {
echo "{$co}은 유효한 형식의 이메일 주소가 아닙니다.<br>";
}
PHP에서는 유효한 형식의 이메일 주소인지를 확인하기 위해 정규 표현식뿐만 아니라 filter_var() 함수를 제공하고 있습니다.
예제
$com = "help@abcd.com";
$co = "help@abcd.co.kr";
if (filter_var($com, FILTER_VALIDATE_EMAIL)) {
echo $com;
} else {
echo "{$com}은 유효한 형식의 이메일 주소가 아닙니다.<br>";
}
if (filter_var($co, FILTER_VALIDATE_EMAIL)) {
echo $co;
} else {
echo "{$co}은 유효한 형식의 이메일 주소가 아닙니다.<br>";
}
filter_var() 함수에 대한 더 자세한 사항은 PHP Form 입력 형식 검증 수업에서 확인할 수 있습니다.
한글 확인
정규 표현식에서는 영문자뿐만 아니라 한글도 사용할 수 있습니다.
해당 문자가 한글인지를 확인하는 정규 표현식은 다음과 같습니다.
정규 표현식
① /[가-힣]/ // 한글 소리 마디
② /[\\x{ac00}-\\x{d7af}]/u // 한글 소리 마디의 유니코드 범위 목록값
한글 소리 마디(hangul syllables)란 초성 19개, 중성 21개, 종성 28개로 이루어지는 총 11,172개의 한글 문자를 가리킵니다.
위의 ①번과 ②번 정규 표현식은 둘 다 현대 한글에서 표현할 수 있는 11,172개의 한글 소리 마디를 모두 검색할 수 있습니다.
이 두 정규 표현식은 대부분의 경우 잘 동작하겠지만, ①번 정규 표현식은 언어 설정이 한글이 아닌 시스템에서는 동작이 안 될 수도 있습니다.
②번 정규 표현식처럼 'u'플래그를 추가하여 해당 정규 표현식 문자열을 UTF-8로 인코딩된 것처럼 취급할 수 있습니다.
예제
$eng = "gil-dong Hong";
$kor = "홍길동";
$pattern = "/[가-힣]+/"; // 한글 소리 마디
if (preg_match($pattern, $eng, $matches_01)) {
var_dump($matches_01);
} else {
echo "{$eng}에는 한글이 포함되어 있지 않습니다.<br>";
}
if (preg_match($pattern, $kor, $matches_02)) {
var_dump($matches_02);
} else {
echo "{$eng}에는 한글이 포함되어 있지 않습니다.<br>";
}
다음 예제는 해당 문자열에서 한글만을 제거하는 예제입니다.
예제
$text = "123가나abc다라";
$pattern = "/[\\x{ac00}-\\x{d7af}]+/u"; // 한글 소리 마디(UTF-8)
$arr = preg_match_all('/./u', $text, $matches); // 줄 바꿈 문자(\n)를 제외한 임의의 한 문자씩 검색함.
echo preg_replace($pattern, '', $text); // 해당 문자가 한글이면, 빈 문자열로 대체함.