(PHP 4 >= 4.0.5, PHP 5)
preg_replace_callback — 콜백을 이용한 정규 표현식 검색과 치환을 수행
이 함수의 작동은 replacement 대신 callback 을 지정하는 것을 제외하면, preg_replace()와 거의 동일합니다.
검색할 패턴. 문자열이나 문자열을 가진 배열일 수 있습니다.
string 문자열에서 매치한 요소의 배열이 넘겨져서 호출될 콜백. 콜백은 치환할 문자열을 반환해야 합니다.
종종 단 한번만 preg_replace_callback()에만 사용할 callback 함수가 필요합니다. 이러한 경우에 preg_replace_callback() 호출 안에서 create_function()을 사용해서 익명 함수를 선언할 수 있습니다. 이 방법으로 호출에 필요한 모든 정보를 한 군데 위치하게 할 수 있고, 다른 곳에서 사용하지 않는 콜백 함수의 이름으로 함수 이름공간을 어지럽히는 일을 막을 수 있습니다.
Example #1 preg_replace_callback()과 create_function()
/* 유닉스 형식 명령줄 필터로
* 문단의 첫 대문자를 소문자로 바꿉니다. */
$fp = fopen("php://stdin", "r") or die("stdin을 읽을 수 없습니다");
while (!feof($fp)) {
$line = fgets($fp);
$line = preg_replace_callback(
'|<p>\s*\w|',
create_function(
// 여기에서 홑따옴표가 중요합니다.
// 혹은 모든 $를 \$로 회피해야 합니다.
'$matches',
'return strtolower($matches[0]);'
),
$line
);
echo $line;
}
fclose($fp);
?>
검색 치환할 문자열이나 문자열로 이루어진 배열.
각 subject 문자열에 대한 각 패턴의 최대 가능 치환수. 기본값은 -1. (무제한)
지정하면, 이 변수는 치환을 마친 수로 채워집니다.
preg_replace_callback()은 subject 인수에 따라 배열이나 문자열을 반환합니다.
매치가 발견되면 새 subject가 반환되고, 그렇지 않으면 변경되지 않은 subject 가 반환됩니다.
버전 | 설명 |
---|---|
5.1.0 | count 인수 추가 |
Example #2 preg_replace_callback() 예제
<?php
// 이 문장은 2002년에 사용되었습니다.
// 2003년에 적합하게 업데이트합니다.
$text = "April fools day is 04/01/2002\n";
$text.= "Last christmas was 12/24/2001\n";
// 콜백 함수
function next_year($matches)
{
// 보통: $matches[0]는 전채 매치입니다.
// $matches[1]은 첫번째 '(...)'에 들어있는
// 서브 패턴 매치로 이어집니다.
return $matches[1].($matches[2]+1);
}
echo preg_replace_callback(
"|(\d{2}/\d{2}/)(\d{4})|",
"next_year", $text);
?>
위 예제의 출력:
April fools day is 04/01/2003 Last christmas was 12/24/2002
Example #3 BB 코드를 다루기 위해 재귀 구조를 사용하는 preg_replace_callback()
<?php
$input = "plain [indent] deep [indent] deeper [/indent] deep [/indent] plain";
function parseTagsRecursive($input)
{
$regex = '#\[indent]((?:[^[]|\[(?!/?indent)|(?R))+)\[/indent]#';
if (is_array($input)) {
$input = '<div style="margin-left: 10px">'.$input[1].'</div>';
}
return preg_replace_callback($regex, 'parseTagRecursive', $input);
}
$output = parseTagsRecursive($input);
echo $output;
?>