정규식(PCRE) preg_replace
(PHP 4, PHP 5, PHP 7, PHP 8)
preg_replace — 정규식 검색 및 바꾸기 수행
설명
preg_replace( string|array $pattern, string|array $replacement, string|array $subject, int $limit = -1, int &$count = null ): string|array|null
pattern
과 일치하는 subject
을 검색하고 replacement
으로 바꿉니다.
매개변수
pattern
- 검색할 패턴입니다. 문자열이거나 문자열이 있는 배열일 수 있습니다.
여러 PCRE modifiers도 사용할 수 있습니다.
replacement
- 교체할 문자열 또는 문자열이 있는 배열입니다. 이 매개변수가 문자열이고
pattern
매개변수가 배열이면 모든 패턴이 해당 문자열로 대체됩니다.pattern
및replacement
매개변수가 모두 배열인 경우 각pattern
은replacement
대응으로 대체됩니다.replacement
배열에pattern
배열보다 요소가 더 적은 경우 추가pattern
은 빈 문자열로 대체됩니다.replacement
는\n
또는$n
형식의 참조를 포함할 수 있으며 후자의 형식이 선호됩니다. 이러한 모든 참조는 n번째 괄호 패턴으로 캡처된 텍스트로 대체됩니다. n은 0에서 99까지 가능하며\0
또는$0
은 전체 패턴과 일치하는 텍스트를 나타냅니다. 여는 괄호는 캡처하는 하위 패턴의 번호를 얻기 위해 왼쪽에서 오른쪽(1부터 시작)으로 계산됩니다. 문자열 리터럴의 백슬래시는 이스케이프 처리해야 할 수 있습니다.역참조 바로 뒤에 다른 숫자가 오는 대체 패턴으로 작업할 때(즉, 일치하는 패턴 바로 뒤에 리터럴 숫자 배치) 역참조에 대해 익숙한
\1
표기법을 사용할 수 없습니다. 예를 들어,\11
은\1
역참조 다음에 리터럴1
이 필요한지 또는\11
역참조 다음에 아무것도 오지 않는지 알 수 없기 때문에 preg_replace()를 혼동합니다. 이 경우 해결책은${1}1
을 사용하는 것입니다. 이렇게 하면1
을 리터럴로 남겨두고 격리된$1
역참조가 생성됩니다.더 이상 사용되지 않는
e
수정자를 사용할 때 이 함수는 역참조를 대체하는 문자열에서 일부 문자(즉,'
,"
,\
및 NULL)를 이스케이프합니다. 이는 작은따옴표 또는 큰따옴표( 예:'strlen(\'$1\')+strlen("$2")'
) 해석된 문자열이 어떻게 보이는지 정확히 알기 위해 PHP의 string syntax을 알고 있어야 합니다. subject
- 검색하고 바꿀 문자열 또는 문자열이 있는 배열입니다.
subject
가 배열이면subject
의 모든 항목에 대해 검색 및 바꾸기가 수행되고 반환 값도 배열입니다.subject
배열이 연관이면 키가 반환된 값에 보존됩니다. limit
- 각
subject
문자열의 각 패턴에 대해 가능한 최대 대체. 기본값은-1
(제한 없음)입니다. count
- 지정된 경우 이 변수는 수행된 교체 수로 채워집니다.
반환 값
preg_replace()는 subject
매개변수가 배열이면 배열을 반환하고 그렇지 않으면 문자열을 반환합니다.
일치하는 항목이 있으면 새 subject
이 반환되고, 그렇지 않으면 subject
이 변경되지 않고 반환되거나 오류가 발생한 경우 null
이 반환됩니다.
오류/예외
"\e" 수식어를 사용하면 오류가 발생합니다. 이 경우 E_WARNING
이 발생합니다.
전달된 정규식 패턴이 유효한 정규식으로 컴파일되지 않으면 E_WARNING
이 발생합니다.
Examples
예제 #1 역참조 뒤에 숫자 리터럴 사용
<?php
$string = 'April 15, 2003';
$pattern = '/(\w+) (\d+), (\d+)/i';
$replacement = '${1}1,$3';
echo preg_replace($pattern, $replacement, $string);
?>
위의 예는 다음을 출력합니다.
April1,2003
예제 #2 preg_replace()와 함께 인덱스 배열 사용
<?php
$string = 'The quick brown fox jumps 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);
?>
위의 예는 다음을 출력합니다.
The bear black slow jumps over the lazy dog.
패턴과 교체를 ksorting하여 원하는 것을 얻어야 합니다.
<?php
ksort($patterns);
ksort($replacements);
echo preg_replace($patterns, $replacements, $string);
?>
위의 예는 다음을 출력합니다.
The slow black bear jumps over the lazy dog.
예제 #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 공백 제거
이 예는 문자열에서 초과 공백을 제거합니다.
<?php
$str = 'foo o';
$str = preg_replace('/\s\s+/', ' ', $str);
// This will be 'foo o' now
echo $str;
?>
예제 #5 count 매개변수 사용
<?php
$count = 0;
echo preg_replace(array('/\d/', '/\s/'), '*', 'xp 4 to', -1 , $count);
echo $count; //3
?>
위의 예는 다음을 출력합니다.
xp***to 3
메모
메모: pattern
및 replacement
가 있는 배열을 사용할 때 키는 배열에 나타나는 순서대로 처리됩니다. 이것은 숫자 인덱스 순서와 반드시 같지는 않습니다. 인덱스를 사용하여 어떤 pattern
을 어떤 replacement
로 대체해야 하는지 식별하는 경우 preg_replace()를 호출하기 전에 각 배열에 대해 ksort()를 수행해야 합니다.
pattern
과 replacement
가 모두 배열인 경우 일치 규칙이 순차적으로 작동합니다. 즉, 두 번째 pattern
/replacement
쌍은 원래 문자열이 아닌 첫 번째 pattern
/replacement
쌍의 결과인 문자열에서 작동합니다. 두 값을 바꾸는 것과 같이 병렬로 작동하는 교체를 시뮬레이션하려면 한 패턴을 중간 자리 표시자로 교체한 다음 나중에 쌍에서 해당 중간 자리 표시자를 원하는 교체로 교체합니다.
<?php
$p = array('/a/', '/b/', '/c/');
$r = array('b', 'c', 'd');
print_r(preg_replace($p, $r, 'a'));
// prints d
?>
기타
- PCRE Patterns
- preg_quote() - 정규 표현식 문자 인용
- preg_filter() - 정규식 검색 및 바꾸기 수행
- preg_match() - 정규식 일치 수행
- preg_replace_callback() - 정규식 검색을 수행하고 콜백을 사용하여 바꾸기
- preg_split() - 정규 표현식으로 문자열 분할
- preg_last_error() - 마지막 PCRE 정규식 실행의 오류 코드를 반환합니다.