설명
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); ?>
|
이 예제의 출력은:
|
매치가 발견되면, 변환된 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"); ?>
|
이 예제의 결과:
|
예 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().