preg_replace
(PHP 4, PHP 5)
preg_replace — 정규 표현식 검색과 치환을 수행합니다.
설명
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을 문자로 남겨놓습니다.
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()의 모든 인자에는 일차원 배열을 사용할 수 있습니다. pattern 과 replacement 에 배열을 사용할 때는, 배열에 나타나는 순서대로 키를 생성합니다. 똑같은 숫자 인덱스 순서를 가질 필요가 없습니다. 어떤 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 의 모든 엔트리에 검색과 교체를 실행하고, 배열을 반환합니다.
pattern 과 replacement 가 배열이면, preg_replace()는 각각의 배열에서 값을 가져와서 subject 를 검색하고 치환하는데에 이용합니다. replacement 가 pattern 보다 적으면, 대응하는 치환값으로 빈 문자열을 사용합니다. 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 이후에 추가되었습니다.