PHP 매뉴얼
이전 |  | 다음

# preg_replace

(PHP 3>= 3.0.9, PHP 4 , PHP 5)

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

## 설명

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

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

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

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

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

예 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`의 모든 엔트리에 검색과 교체를 실행하고, 배열을 반환합니다.

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

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

예 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

예 4. /e 변경자 사용하기

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

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

예 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);
?>`

> 참고: `limit` 인자는 PHP 4.0.1pl2 이후에 추가되었습니다.

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

이전 | 처음으로 | 다음
preg_replace_callback | 위로 | preg_split