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