Forum und email

preg_replace

(PHP 4, PHP 5)

preg_replace — 정규 표현식 검색과 치환을 수행합니다.

설명

mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit ] )

subject 를 검색하여 매치된 patternreplacement 로 치환합니다. limit 가 지정되면, limit 회의 매치만을 치환합니다; limit 가 -1라면, 모든 매치를 치환합니다.

Replacement\\n나 (PHP 4.0.4부터) $n 형태의 참조를 포함할 수 있습니다. 그러한 모든 참조는 n번째로 잡힌 괄호 패턴으로 대체됩니다. n은 0에서 99까지 가능하고, \\0$0는 전체 패턴에 매치된 텍스트를 의미합니다. 괄호를 여는것은 서브패턴을 포함하여 왼쪽에서 오른쪽(1로부터 시작)으로 카운트합니다.

역참조 바로 뒤에 다른 숫자가 따라오는 패턴을 사용할 때는(즉, 매치된 패턴 바로 뒤에 수 문자가 위치), \\1 식의 역참조를 사용할 수 없습니다. 예를 들면, \\11preg_replace()에서 문자 1이 따라오는 역참조 \\1인지, 역참조 \\1인지를 구분할 수 없습니다. 이 경우, 해결책은 \${1}1를 사용합니다. 이는 독립된 역참조 $1를 작성하고, 1을 문자로 남겨놓습니다.

Example#1 숫자에 대해 역참조 사용하기

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

이 예제의 출력은:

April1,2003

매치가 발견되면, 변환된 subject 를 반환하고, 그렇지 않으면 변경되지 않은 subject 를 반환합니다.

(limit 를 제외한) preg_replace()의 모든 인자에는 일차원 배열을 사용할 수 있습니다. patternreplacement 에 배열을 사용할 때는, 배열에 나타나는 순서대로 키를 생성합니다. 똑같은 숫자 인덱스 순서를 가질 필요가 없습니다. 어떤 pattern 을 어떠한 replacement 로 교체할건지를 결정하기 위해서는, preg_replace()를 호출하기 전에 각각의 배열에 ksort()를 실행해야만 합니다.

Example#2 정렬을 통해 preg_replace() 사용하기

<?php
$string 
"The quick brown fox jumped over the lazy dog.";

$patterns[0] = "/quick/";
$patterns[1] = "/brown/";
$patterns[2] = "/fox/";

$replacements[2] = "bear";
$replacements[1] = "black";
$replacements[0] = "slow";

echo 
preg_replace($patterns$replacements$string);
?>

출력:

The bear black slow jumped over the lazy dog.

patterns와 replacemets를 ksort함으로써, 원하던 결과를 얻게 됩니다.

<?php
ksort
($patterns);
ksort($replacements);

echo 
preg_replace($patterns$replacements$string);
?>

출력:

The slow black bear jumped over the lazy dog.

subject 가 배열이면, subject 의 모든 엔트리에 검색과 교체를 실행하고, 배열을 반환합니다.

patternreplacement 가 배열이면, preg_replace()는 각각의 배열에서 값을 가져와서 subject 를 검색하고 치환하는데에 이용합니다. replacementpattern 보다 적으면, 대응하는 치환값으로 빈 문자열을 사용합니다. pattern 이 배열이고 replacement 가 문자열이면, 치환 문자열을 모든 pattern 값에 사용합니다. 물론, 이 경우들의 반대는 말이 안됩니다.

/e 변경자는 preg_replace()replacement 인자를 참조 치환을 한 후에 PHP 코드로 취급합니다. 팁: replacement 가 정상적인 PHP 코드 문자열을 가지게 하십시오. 그렇지 않으면, PHP는 preg_replace()를 포함하는 줄에서 파싱 에러를 출력합니다.

Example#3 여러 값을 치환하기

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

이 예제의 결과:

$startDate = 5/27/1999

Example#4 /e 변경자 사용하기

<?php
preg_replace
("/(<\/?)(\w+)([^>]*>)/e"
             
"'\\1'.strtoupper('\\2').'\\3'"
             
$html_body);
?>

입력된 텍스트의 모든 HTML 태그를 대문자로 변경합니다.

Example#5 HTML을 텍스트로 변환하기

<?php
// $document는 HTML 문서를 포함합니다.
// 이는 HTML 태그, 자바스크립트 섹션, 공백을
// 제거합니다. 또한, 몇몇 일반적인 HTML 엔티티를
// 동일한 텍스트로 변환합니다.

$search = array ("'<script[^>]*?>.*?</script>'si",  // 자바 스크립트 제거
                 
"'<[\/\!]*?[^<>]*?>'si",           // HTML 태그 제거
                 
"'([\r\n])[\s]+'",                 // 공백 제거
                 
"'&(quot|#34);'i",                 // HTML 엔티티 치환
                 
"'&(amp|#38);'i",
                 
"'&(lt|#60);'i",
                 
"'&(gt|#62);'i",
                 
"'&(nbsp|#160);'i",
                 
"'&(iexcl|#161);'i",
                 
"'&(cent|#162);'i",
                 
"'&(pound|#163);'i",
                 
"'&(copy|#169);'i",
                 
"'&#(\d+);'e");                    // php로 실행

$replace = array ("",
                  
"",
                  
"\\1",
                  
"\"",
                  
"&",
                  
"<",
                  
">",
                  
" ",
                  
chr(161),
                  
chr(162),
                  
chr(163),
                  
chr(169),
                  
"chr(\\1)");

$text preg_replace($search$replace$document);
?>

Note: limit 인자는 PHP 4.0.1pl2 이후에 추가되었습니다.

참고: preg_match(), preg_match_all(), preg_split().