커뮤니티

고용노동부, 산업인력공단과 함께하는 강원도 유일한 기업중심 IT전문교육기관 ICT융합캠퍼스만의 특별한교육입니다.
공인 IT숙련기술인의 다양한 접근방법으로 전문가다운 실무교육을 받을 수 있습니다.

Category

교육강좌

언어 PHP - 정규 표현식

페이지 정보

작성자 관리자 댓글 0건 조회 2,992회 작성일 20-06-10 13:35

본문

정규 표현식

정규 표현식

 

정규 표현식(正規表現式,Regular Expression)은 문자열을 처리하는 방법 중의 하나로 특정한 조건의 문자를 '검색'하거나 '치환'하는 과정을 매우 간편하게 처리 할 수 있도록 하는 수단이다.

선행지식

정규 표현식은 이것 자체로도 한권의 책이 필요할 정도로 방대하다. (물론 간단한 정규 표현식을 배우는데는 큰 노력이 들지 않는다.) 정규 표현식에 대해서 잘 모른다면 '정규 표현식 패턴들' 수업을 먼저 보고 이후의 내용을 학습하는 것을 권장한다.

표현식

http://ult-tex.net/info/perl/

PHP와 정규표현식

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

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

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

preg_match

검색을 수행하고 일치하는 내용을 반환한다.

i는 패턴 매칭을 할 때 대소문자를 구분하지 않도록 한다.

1
2
3
4
5
6
7
<?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는 단어의 경계를 의미한다. 그렇기 때문에 \b로 감싸진 web은 web이라는 독립된 단어를 의미한다. website는 web과 site가 결합된 단어이기 때문에 이 조건에 해당하지 않는다.

1
2
3
4
5
6
7
8
9
10
11
12
13
<?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.";
}
?>
1
2
3
4
5
6
7
8
<?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];
?>

1
2
3
4
5
6
7
8
9
10
<?php
// get host name from URL
preg_match('@^(?:http://)?([^/]+)@i',
$host = $matches[1];
// get last two segments of host name
preg_match('/[^.]+\.[^.]+$/', $host, $matches);
echo "domain name is: {$matches[0]}\n";
?>

 

1
2
3
4
5
6
7
8
9
10
11
12
13
<?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

검색한 다음 치환명령을 수행한다. (참고)

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

 

1
2
3
4
5
6
7
8
9
10
11
12
<?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]가 된다. 필자도 나중에 알게 된 사실이다. 
1
2
3
4
5
6
7
<?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');
?>

 

  • 트위터로 보내기
  • 페이스북으로 보내기
  • 구글플러스로 보내기

답변목록

등록된 답변이 없습니다.