[PHP] 문자열을 딱 한 번만 찾아 바꾸기

  특정 문자열을 한꺼번에 모두 바꿀 때에 str_replace 함수를 쓸 수 있다. str_replace 함수의 원형은 다음과 같다.

 str_replace(
array|string $search,
array|string $replace,
string|array $subject,
int &$count = null
): string|array

  본래 문자열 $original_str에서 $search를 $replace로 바꾸어 $replaced_str에 넣으려면 이렇게 할 수 있다.

$original_str = '12, ab, abc, abcd';
$search = 'ab';
$replace = 'AB';
$replaced_str = str_replace($search, $replace, $original_str, $count);

// 결과(var_dump)
// $search : string(2) "ab"
// $replace : string(2) "AB"
// $original_str : string(17) "ab, abc, abcd"
// $replaced_str : string(17) "AB, ABc, ABcd"
// $count : int(3)
str_replace로 바꾼 문자열 var_dump 결과

  $count에는 $search를 $replace로 바꾼 횟수가 들어간다.주1

  이처럼 str_replace 함수를 쓰면 찾는 문자열($search)이 바꾸는 문자열($replace)로 모두 바뀌고, 문자열을 몆 번 바꿀지는 고를 수 없다. 몆 번 바꿀지를 고르려면 str_replace를 쓰지 않고 다른 방법을 써야 한다.

  아래는 특정 문자열을 처음에 나오는 딱 하나만 바꾸는 방법들이다.

(1) preg_replace 함수

  preg_replace 함수 원형은 다음과 같다.

 preg_replace(
string|array $pattern,
string|array $replacement,
string|array $subject,
int $limit = -1,
int &$count = null
): string|array|null

  본래 문자열 $original_str에서 $search를 $replace로 바꾸어 한 번만 바꾸어 $replaced_str에 넣으려면  이렇게 할 수 있다.주2

$original_str = '12, ab, abc, abcd';
$search = 'ab';
$replace = 'AB';
$pattern = '/'.preg_quote($search, '/').'/';
$replaced_str = preg_replace($pattern, $replace, $original_str, 1, $count);

// 결과(var_dump)
// $search : string(2) "ab"
// $pattern : string(4) "/ab/"
// $replace : string(2) "AB"
// $original_str : string(17) "12, ab, abc, abcd"
// $replaced_str : string(17) "12, AB, abc, abcd"
// $count : int(1)

  preg_replace 함수의 $limit 자리에 1를 넣었으므로 ab가 AB로 한 번만 바뀐다. 2을 넣으면 ab가 AB로 두 번 바뀌고, -1를 넣으면 str_replace 함수를 쓰는 때처럼 ab가 AB로 모두 바뀐다.

  preg_replace 함수에서 $pattern 자리에는 정규 표현식이 들어간다. 그래서 본래 문자열($original_str)에 정규 표현식에 쓰이는 메타 문자와 따옴표로 쓰이는 문자가 들어 있으면 바꾸어 줄 필요가 있는데, 이 문자들을 바꾸어 주는 일을 preg_quote 함수가 해 준다. 여기에서는 본래 문자열인 $original_str에 정규 표현식에 쓰이는 문자가 들어가지 않았으므로 preg_quote 함수를 쓰지 않아도 결과는 같다.

(2) substr_replace 함수

  substr_replace 함수의 원형은 다음과 같다.

 substr_replace(
array|string $string,
array|string $replace,
array|int $offset,
array|int|null $length = null
): string|array

  substr 함수로 문자열의 어느 자리 내용을 뽑을 수 있는데, substr_replace 함수로는 문자열의 어느 자리 내용을 바꿀 수 있다.

$original_str = '12, ab, abc, abcd';
$search = 'ab';
$replace = 'AB';

$pos = strpos($original_str, $search);
if ($pos !== false) {
$replaced_str = substr_replace($original_str, $replace, $pos, strlen($search));
}

// 결과(var_dump)
// $search : string(2) "ab"
// $replace : string(2) "AB"
// $original_str : string(17) "12, ab, abc, abcd"
// $replaced_str : string(17) "12, AB, abc, abcd"
// $pos : int(4)

(3) implode, explode 함수

  implode 함수와 explode 함수의 원형은 다음과 같다.

implode(string $separator, array $array): string
implode(array $array): string
 explode(string $separator, string $string, int $limit = PHP_INT_MAX): array

  explode 함수로는 문자열을 배열로 나누고, implode 함수로는 배열들을 문자열을 합친다.

$original_str = '12, ab, abc, abcd';
$search = 'ab';
$replace = 'AB';
$replaced_str = implode($replace, explode($search, $original_str, 2));

// 결과(var_daump)
// $search : string(2) "ab"
// $replace : string(2) "AB"
// $original_str : string(17) "12, ab, abc, abcd"
// $replaced_str : string(17) "12, AB, abc, abcd"

  explode 함수에서 $limit는 나누는 배열의 수이다. 문자열을 한 번 바꿀 때에는 $limit 자리에 2을 넣고, 두 번 바꿀 때에는 $limit 자리에 3을 넣는다.

※ 참고한 글

〈주석〉
  1. 흔히 $count 자리를 채우지 않고 쓰곤 한다. back
  2. preg_replace 함수도 $count 자리를 흔히 채우지 않고 쓰곤 한다. back
글 걸기 주소 : 이 글에는 글을 걸 수 없습니다.

덧글을 달아 주세요