메뉴 건너뛰기

logo

PHP

PHP와 정규표현식

2018.01.19 14:45 조회 수 3483

PHP의 정규표현식은 구분자(delimiters)로 시작해서 구분자로 끝을 내야한다. 구분자는 보통 슬래쉬(/)를 사용하지만 꼭 그래야 하는 것은 아니고 해쉬(#)와 같이 알파벳과 백슬래쉬 그리고 공백이 아닌 문자를 사용하면 된다. 아래의 그림에서 강조표시한 부분은 모두 구분자가 될 수 있는 문자들이다. (참고)

닫히는 구분자 뒤에는 옵셥(Internal Option)이 위치할 수 있는데 옵션에 따라서 정규표현식이 다르게 동작한다. 아래는 대소문자를 구분하지 않는 'i'와 줄바꿈 문자에 따라서 텍스트의 행을 구분하도록 하는 'm'을 적용한 예다. (참고)

PHP는 UNIX 스타일의 정규표현식인 ereg와 Perl 스타일의 정규표현식인 preg를 지원한다. 이 중에서 ereg는 폐지 예정(Deprecated)이기 때문에 사용해서는 안된다.

 

preg_match - 검색

 

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

 

 

\b는 단어의 경계를 의미한다. 

 

<?php
if (preg_match("/\bweb\b/i", "PHP is the web scripting language of choice.")) {
    echo "A match was found.";
} else {
    echo "A match was not found.";
}
 
if (preg_match("/\bweb\b/i", "PHP is the website scripting language of choice.")) {
    echo "A match was found.";
} else {
    echo "A match was not found.";
}
?>

 

 

<?php
$subject = 'coding everybody http://opentutorials.org egoing@egoing.com 010-0000-0000';
preg_match('~(http://\w+\.\w+)\s(\w+@\w+\.\w+)~', $subject, $match);
var_dump($match);
echo "homepage:".$match[1];
echo "<br />";
echo "email:".$match[2];
?>

 

 

<?php
// get host name from URL
preg_match('@^(?:http://)?([^/]+)@i',
    "http://www.php.net/index.html", $matches);
$host = $matches[1];
 
// get last two segments of host name
preg_match('/[^.]+\.[^.]+$/', $host, $matches);
echo "domain name is: {$matches[0]}\n";
?>

 

 

<?php
 
$str = 'foobar: 2008';
 
preg_match('/(?P<name>\w+): (?P<digit>\d+)/', $str, $matches);
 
/* This also works in PHP 5.2.2 (PCRE 7.0) and later, however 
 * the above form is recommended for backwards compatibility */
// preg_match('/(?<name>\w+): (?<digit>\d+)/', $str, $matches);
 
print_r($matches);
 
?>

 

 

preg_replace - 치환

 

<?php
$string = 'April 15, 2003';
$pattern = '/(\w+) (\d+), (\d+)/i';
$replacement = '${1}1,$3';
echo preg_replace($pattern, $replacement, $string);
?>

 

 

<?php
$string = '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, $string);
?>

 

예상한 것과 다른 결과가 출력 될 것이다. 그것은 $replacements의 값을 정의한 순서 때문이다. $replacements의 인덱스 값을 2,1,0 순으로 정의했는데 php는 인덱스 값의 순서에 따라서 치환을 하는 것이 아니고, 배열의 값이 생성된 순서대로 치환을 하기 때문에 $patterns[0]의 카운터 파트너는 $replacements[0]이 아니라 $replacements[2]가 된다.

 

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

 

번호 제목 날짜 조회 수
28 암호화 md5() 2018.02.20 3128
27 암호화 BCRYPT [1] 2018.02.20 3731
26 Session 구현 2018.02.19 2866
» PHP와 정규표현식 2018.01.19 3483
24 PHP 쿠키 구현 2018.01.18 3746
23 SQL 조회 - 문자렬 검색 2017.12.20 3477
22 PHP 변수 출력 2017.12.14 4065
21 PHP 파일 업로드 - 3 2017.12.13 4667
20 foreach (array_expression as $key => $value) { statements; } 2017.12.13 3344
19 foreach (array_expression as $value) { statements; } [2] 2017.12.13 4049
18 INPUT요소 배열화 & PHP에서 자바스크립트로 값 넘기기 [1] 2017.12.13 4304
17 PHP 파일 업로드 - 2 [1] 2017.12.12 4098
16 pathinfo() 2017.12.12 3348
15 getimagesize() 2017.12.12 3389
14 PHP 파일 업로드 - 1 2017.12.11 3879
13 CODE의 저장과 복원 2017.12.08 3453
12 mySQL 기본 명령어 [1] 2017.01.31 6833
11 객체 지향 프로그래밍? 2015.10.17 3788
10 문자열 처리 2015.10.17 3418
9 include와 namespace 2015.10.17 3689
위로가기