update : 2015.11.03
php.shukuma.com

검색:
 
 
콜백을 이용한 정규 표현식 검색과 치환을 수행

preg_replace_callback

(PHP 4 >= 4.0.5, PHP 5)

preg_replace_callback콜백을 이용한 정규 표현식 검색과 치환을 수행

설명

mixed preg_replace_callback ( mixed $pattern , callback $callback , mixed $subject [, int $limit [, int &$count ]] )

이 함수의 작동은 replacement 대신 callback을 지정하는 것을 제외하면, preg_replace()와 거의 동일합니다.

인수

pattern

검색할 패턴. 문자열이나 문자열을 가진 배열일 수 있습니다.

callback

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

검색 치환할 문자열이나 문자열로 이루어진 배열.

limit

subject 문자열에 대한 각 패턴의 최대 가능 치환수. 기본값은 -1. (무제한)

count

지정하면, 이 변수는 치환을 마친 수로 채워집니다.

반환값

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;
?>

참고