정규 표현식
정규 표현식(正規表現式,Regular Expression)은 문자열을 처리하는 방법 중의 하나로 특정한 조건의 문자를 '검색'하거나 '치환'하는 과정을 매우 간편하게 처리 할 수 있도록 하는 수단이다.
선행지식
정규 표현식은 이것 자체로도 한권의 책이 필요할 정도로 방대하다. (물론 간단한 정규 표현식을 배우는데는 큰 노력이 들지 않는다.) 정규 표현식에 대해서 잘 모른다면 '정규 표현식 패턴들' 수업을 먼저 보고 이후의 내용을 학습하는 것을 권장한다.
표현식
PHP와 정규표현식
PHP의 정규표현식은 구분자(delimiters)로 시작해서 구분자로 끝을 내야한다. 구분자는 보통 슬래쉬(/)를 사용하지만 꼭 그래야 하는 것은 아니고 해쉬(#)와 같이 알파벳과 백슬래쉬 그리고 공백이 아닌 문자를 사용하면 된다. 아래의 그림에서 강조표시한 부분은 모두 구분자가 될 수 있는 문자들이다. (참고)
![](https://s3.ap-northeast-2.amazonaws.com/opentutorials-user-file/module/6/1790.gif)
닫히는 구분자 뒤에는 옵셥(Internal Option)이 위치할 수 있는데 옵션에 따라서 정규표현식이 다르게 동작한다. 아래는 대소문자를 구분하지 않는 'i'와 줄바꿈 문자에 따라서 텍스트의 행을 구분하도록 하는 'm'을 적용한 예다. (참고)
![](https://s3.ap-northeast-2.amazonaws.com/opentutorials-user-file/module/6/1791.gif)
PHP는 UNIX 스타일의 정규표현식인 ereg와 Perl 스타일의 정규표현식인 preg를 지원한다. 이 중에서 ereg는 폐지 예정(Deprecated)이기 때문에 사용해서는 안된다. (참고)
preg_match
검색을 수행하고 일치하는 내용을 반환한다.
i는 패턴 매칭을 할 때 대소문자를 구분하지 않도록 한다.
<?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가 결합된 단어이기 때문에 이 조건에 해당하지 않는다.
<?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); ?>
<?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'); ?>