답변:
preg_replace 로 수행 할 수 있습니다 :
function str_replace_first($from, $to, $content)
{
$from = '/'.preg_quote($from, '/').'/';
return preg_replace($from, $to, $content, 1);
}
echo str_replace_first('abc', '123', 'abcdef abcdef abcdef');
// outputs '123def abcdef abcdef'
마술은 선택 사항 인 네 번째 매개 변수 [Limit]에 있습니다. 설명서에서 :
[제한]-각 주제 문자열에서 각 패턴에 대한 가능한 최대 교체입니다. 기본값은 -1입니다 (제한 없음).
그러나 보다 효율적인 방법에 대해서는 zombat의 답변 을 참조하십시오 (대략 3-4 배 빠름).
preg_quote
있습니까? 예를 들어 @ThomasRedstone은 구분 기호 /
가에 표시되면 위험 할 수 있다고 걱정하지만 불행히도 $from
그렇지 않습니다. preg_quote
두 번째 매개 변수 때문에 올바르게 이스케이프 처리 됩니다 (쉽게 테스트 할 수 있음). 특정 문제 (내 책의 심각한 PCRE 보안 버그 일 수 있음)에 대해 듣고 싶습니다.
그것의 버전은 없지만 해결책은 전혀 해킹되지 않습니다.
$pos = strpos($haystack, $needle);
if ($pos !== false) {
$newstring = substr_replace($haystack, $replace, $pos, strlen($needle));
}
매우 쉽고 정규 표현식의 성능 저하를 줄입니다.
보너스 : 마지막 발생 을 바꾸려면 strrpos
대신에 사용하십시오 strpos
.
substr_replace
모든 매개 변수로 인해 사용하기가 다소 다루기 어려운 함수 이지만 실제 문제는 숫자로 문자열 조작을 수행하는 것이 까다로울 수 있다는 것입니다. 함수에 올바른 변수 / 오프셋을 전달해야합니다. 나는 실제로 위의 코드가 가장 간단하고 나에게 논리적 인 접근 방식이라고 말하기까지 했어요.
편집 : 두 답변이 모두 업데이트되었으며 이제 정확합니다. 함수 타이밍이 여전히 유용하기 때문에 답을 남겨 두겠습니다.
'zombat'과 '너무 많은 PHP'의 답변은 불행히도 정확하지 않습니다. 이것은 zombat가 게시 한 답변에 대한 개정입니다 (댓글을 게시 할만 큼 평판이 좋지 않기 때문에).
$pos = strpos($haystack,$needle);
if ($pos !== false) {
$newstring = substr_replace($haystack,$replace,$pos,strlen($needle));
}
strlen ($ replace) 대신 strlen ($ needle)에 유의하십시오. Zombat의 예제는 바늘과 교체 길이가 동일한 경우에만 올바르게 작동합니다.
PHP 자체의 str_replace와 동일한 서명을 가진 함수의 기능은 다음과 같습니다.
function str_replace_first($search, $replace, $subject) {
$pos = strpos($subject, $search);
if ($pos !== false) {
return substr_replace($subject, $replace, $pos, strlen($search));
}
return $subject;
}
이것은 '너무 많은 PHP'의 수정 된 답변입니다.
implode($replace, explode($search, $subject, 2));
끝에 1 대신 2를 기록하십시오. 또는 함수 형식으로 :
function str_replace_first($search, $replace, $subject) {
return implode($replace, explode($search, $subject, 2));
}
두 기능의 시간을 정했으며 일치하는 항목이 없으면 첫 번째 기능이 두 배 빠릅니다. 일치하는 것이 발견 될 때 동일한 속도입니다.
stripos()
구출 :-)
어느 것이 가장 빠른지 궁금해서 모두 테스트했습니다.
아래에서 찾을 수 있습니다 :
모든 기능은 동일한 설정으로 테스트되었습니다.
$string = 'OOO.OOO.OOO.S';
$search = 'OOO';
$replace = 'B';
문자열 내 에서 처음 나타나는 문자열 만 바꾸는 함수 :
substr_replace($string, $replace, 0, strlen($search));
[CONTRIBUTED BY] => zombat
[OOO.OOO.OOO.S] => B.OOO.OOO.S
[AVERAGE TIME] => 0.0000062883
[SLOWER BY] => FASTEST
replace_first($search, $replace, $string);
[CONTRIBUTED BY] => too much php
[OOO.OOO.OOO.S] => B.OOO.OOO.S
[AVERAGE TIME] => 0.0000073902
[SLOWER BY] => 17.52%
preg_replace($search, $replace, $string, 1);
[CONTRIBUTED BY] => karim79
[OOO.OOO.OOO.S] => B.OOO.OOO.S
[AVERAGE TIME] => 0.0000077519
[SLOWER BY] => 23.27%
str_replace_once($search, $replace, $string);
[CONTRIBUTED BY] => happyhardik
[OOO.OOO.OOO.S] => B.OOO.OOO.S
[AVERAGE TIME] => 0.0000082286
[SLOWER BY] => 30.86%
str_replace_limit($search, $replace, $string, $count, 1);
[CONTRIBUTED BY] => bfrohs - expanded renocor
[OOO.OOO.OOO.S] => B.OOO.OOO.S
[AVERAGE TIME] => 0.0000083342
[SLOWER BY] => 32.54%
str_replace_limit($search, $replace, $string, 1);
[CONTRIBUTED BY] => renocor
[OOO.OOO.OOO.S] => B.OOO.OOO.S
[AVERAGE TIME] => 0.0000093116
[SLOWER BY] => 48.08%
str_replace_limit($string, $search, $replace, 1, 0);
[CONTRIBUTED BY] => jayoaK
[OOO.OOO.OOO.S] => B.OOO.OOO.S
[AVERAGE TIME] => 0.0000093862
[SLOWER BY] => 49.26%
문자열 내 에서 마지막으로 나타나는 문자열 만 바꾸는 함수 :
substr_replace($string, $replace, strrpos($string, $search), strlen($search));
[CONTRIBUTED BY] => oLinkSoftware - modified zombat
[OOO.OOO.OOO.S] => OOO.OOO.B.S
[AVERAGE TIME] => 0.0000068083
[SLOWER BY] => FASTEST
strrev(implode(strrev($replace), explode(strrev($search), strrev($string), 2)));
[CONTRIBUTED BY] => oLinkSoftware
[OOO.OOO.OOO.S] => OOO.OOO.B.S
[AVERAGE TIME] => 0.0000084460
[SLOWER BY] => 24.05%
substr_replace()
결과를 얻는 이유 는 간단합니다. 내부 함수이기 때문입니다. 내부 기능은 하위 계층에서 실행되므로 두 가지 동일한 기능을 수행하는 내부 및 사용자 정의 함수는 성능이 다릅니다. 그렇다면 왜 안 preg_match()
되겠습니까? 정규식은 문자열을 여러 번 검색하기 때문에 모든 내부 문자열 조작 함수보다 거의 느립니다.
substr_replace($string, $replace, 0, strlen($search));
) 의 벤치 마크가 단지 정적이라고 쓰지 않기를 바랍니다 0
. 비정규 솔루션의 컨볼 루션 중 일부는 교체 할 위치를 알기 전에 시작점을 "찾아야"한다는 것입니다.
불행히도, 나는 이것을 할 수있는 PHP 기능을 모른다.
다음과 같이 쉽게 자신의 것을 굴릴 수 있습니다.
function replace_first($find, $replace, $subject) {
// stolen from the comments at PHP.net/str_replace
// Splits $subject into an array of 2 items by $find,
// and then joins the array with $replace
return implode($replace, explode($find, $subject, 2));
}
return implode($replace, explode($find, $subject, $limit+1));
맞춤 교체 번호
Regexp가 필요없이 문자열의 문자열 (대소 문자 구분)을 제한으로 바꾸는 이 작은 함수를 만들었습니다 . 잘 작동합니다.
function str_replace_limit($search, $replace, $string, $limit = 1) {
$pos = strpos($string, $search);
if ($pos === false) {
return $string;
}
$searchLen = strlen($search);
for ($i = 0; $i < $limit; $i++) {
$string = substr_replace($string, $replace, $pos, $searchLen);
$pos = strpos($string, $search);
if ($pos === false) {
break;
}
}
return $string;
}
사용법 예 :
$search = 'foo';
$replace = 'bar';
$string = 'foo wizard makes foo brew for evil foo and jack';
$limit = 2;
$replaced = str_replace_limit($search, $replace, $string, $limit);
echo $replaced;
// bar wizard makes bar brew for evil foo and jack
===false
대신 is_bool(
더 명시 적으로 -이 엄지 손가락을주는거야 는 정규식 광기를 피했다해서 ! ... 그리고 동시에 작동하고 깨끗한 솔루션입니다 ...
preg_
솔루션을 선호하는 것은 광기가 아니라 개인적인 취향입니다. return preg_replace('/'.preg_quote($search, '/').'/', $replace, $content, 1);
정규식을 두려워하지 않는 사람들에게는 읽기 쉽습니다. 대소 문자를 구분하지 않는 검색이 필요하십니까? i
끝 패턴 구분 기호 뒤에 추가하십시오 . 유니 코드 / 멀티 바이트 지원이 필요하십니까? u
끝 패턴 구분 기호 뒤에 추가하십시오 . 단어 경계 지원이 필요하십니까? \b
검색 문자열의 양쪽에 추가하십시오 . 정규식을 원하지 않으면 정규식을 사용하지 마십시오. 물론 말을위한 말이지 만 광기는 아닙니다.
가장 쉬운 방법은 정규식을 사용하는 것입니다.
다른 방법은 strpos ()를 사용하여 문자열의 위치를 찾은 다음 substr_replace ()를 찾는 것입니다
그러나 나는 정말로 RegExp에 갈 것입니다.
function str_replace_once($search, $replace, $subject) {
$pos = strpos($subject, $search);
if ($pos === false) {
return $subject;
}
return substr($subject, 0, $pos) . $replace . substr($subject, $pos + strlen($search));
}
=> 코드가 수정되었으므로 너무 오래된 주석을 고려하십시오.
그리고 모두 감사합니다 나를 돕는는 것을 개선하기 위해
모든 버그, 저에게 알려주십시오. 내가 바로 고칠거야
그래서 가자 :
예를 들어 첫 번째 'o' 를 'ea' 로 바꾸기 :
$s='I love you';
$s=str_replace_first('o','ea',$s);
echo $s;
//output: I leave you
함수:
function str_replace_first($a,$b,$s)
{
$w=strpos($s,$a);
if($w===false)return $s;
return substr($s,0,$w).$b.substr($s,$w+strlen($a));
}
substr($where,$b+strlen($this))
그렇지 않다고 생각한다 substr($where,$b+1)
. 그리고 나는 그것이 substr_replace
더 빠르다고 생각합니다 .
$string = 'this is my world, not my world';
$find = 'world';
$replace = 'farm';
$result = preg_replace("/$find/",$replace,$string,1);
echo $result;
preg_quote
의를 $find
표현으로 사용하기 전에.
preg_quote()
@renocor의 답변 을 확장하기 위해 와 100 % 역 호환되는 함수를 작성했습니다 str_replace()
. 즉, 대체 할 수있다 모든 의 발생 str_replace()
과를 str_replace_limit()
에 대해 아무 것도 엉망으로하지 않고 심지어 사용하여 배열을 $search
, $replace
및 / 또는 $subject
.
이 기능은 수 당신이 함수 호출을 대체하고자한다면, 완전히 독립적 일 수 ($string===strval(intval(strval($string))))
있지만, 이후는 반대 권하고 싶습니다 valid_integer()
문자열로 제공 정수를 처리 할 때 상당히 유용한 기능입니다.
참고 : 가능할 때마다 대신 str_replace_limit()
사용 str_replace()
되므로 성능에 대한 염려없이 모든 호출을 str_replace()
대체 할 수 있습니다 str_replace_limit()
.
<?php
$search = 'a';
$replace = 'b';
$subject = 'abcabc';
$limit = -1; // No limit
$new_string = str_replace_limit($search, $replace, $subject, $count, $limit);
echo $count.' replacements -- '.$new_string;
교체 2 개-bbcbbc
$limit = 1; // Limit of 1
$new_string = str_replace_limit($search, $replace, $subject, $count, $limit);
echo $count.' replacements -- '.$new_string;
교체 1 개-bbcabc
$limit = 10; // Limit of 10
$new_string = str_replace_limit($search, $replace, $subject, $count, $limit);
echo $count.' replacements -- '.$new_string;
교체 2 개-bbcbbc
<?php
/**
* Checks if $string is a valid integer. Integers provided as strings (e.g. '2' vs 2)
* are also supported.
* @param mixed $string
* @return bool Returns boolean TRUE if string is a valid integer, or FALSE if it is not
*/
function valid_integer($string){
// 1. Cast as string (in case integer is provided)
// 1. Convert the string to an integer and back to a string
// 2. Check if identical (note: 'identical', NOT just 'equal')
// Note: TRUE, FALSE, and NULL $string values all return FALSE
$string = strval($string);
return ($string===strval(intval($string)));
}
/**
* Replace $limit occurences of the search string with the replacement string
* @param mixed $search The value being searched for, otherwise known as the needle. An
* array may be used to designate multiple needles.
* @param mixed $replace The replacement value that replaces found search values. An
* array may be used to designate multiple replacements.
* @param mixed $subject The string or array being searched and replaced on, otherwise
* known as the haystack. If subject is an array, then the search and replace is
* performed with every entry of subject, and the return value is an array as well.
* @param string $count If passed, this will be set to the number of replacements
* performed.
* @param int $limit The maximum possible replacements for each pattern in each subject
* string. Defaults to -1 (no limit).
* @return string This function returns a string with the replaced values.
*/
function str_replace_limit(
$search,
$replace,
$subject,
&$count,
$limit = -1
){
// Set some defaults
$count = 0;
// Invalid $limit provided. Throw a warning.
if(!valid_integer($limit)){
$backtrace = debug_backtrace();
trigger_error('Invalid $limit `'.$limit.'` provided to '.__function__.'() in '.
'`'.$backtrace[0]['file'].'` on line '.$backtrace[0]['line'].'. Expecting an '.
'integer', E_USER_WARNING);
return $subject;
}
// Invalid $limit provided. Throw a warning.
if($limit<-1){
$backtrace = debug_backtrace();
trigger_error('Invalid $limit `'.$limit.'` provided to '.__function__.'() in '.
'`'.$backtrace[0]['file'].'` on line '.$backtrace[0]['line'].'. Expecting -1 or '.
'a positive integer', E_USER_WARNING);
return $subject;
}
// No replacements necessary. Throw a notice as this was most likely not the intended
// use. And, if it was (e.g. part of a loop, setting $limit dynamically), it can be
// worked around by simply checking to see if $limit===0, and if it does, skip the
// function call (and set $count to 0, if applicable).
if($limit===0){
$backtrace = debug_backtrace();
trigger_error('Invalid $limit `'.$limit.'` provided to '.__function__.'() in '.
'`'.$backtrace[0]['file'].'` on line '.$backtrace[0]['line'].'. Expecting -1 or '.
'a positive integer', E_USER_NOTICE);
return $subject;
}
// Use str_replace() whenever possible (for performance reasons)
if($limit===-1){
return str_replace($search, $replace, $subject, $count);
}
if(is_array($subject)){
// Loop through $subject values and call this function for each one.
foreach($subject as $key => $this_subject){
// Skip values that are arrays (to match str_replace()).
if(!is_array($this_subject)){
// Call this function again for
$this_function = __FUNCTION__;
$subject[$key] = $this_function(
$search,
$replace,
$this_subject,
$this_count,
$limit
);
// Adjust $count
$count += $this_count;
// Adjust $limit, if not -1
if($limit!=-1){
$limit -= $this_count;
}
// Reached $limit, return $subject
if($limit===0){
return $subject;
}
}
}
return $subject;
} elseif(is_array($search)){
// Only treat $replace as an array if $search is also an array (to match str_replace())
// Clear keys of $search (to match str_replace()).
$search = array_values($search);
// Clear keys of $replace, if applicable (to match str_replace()).
if(is_array($replace)){
$replace = array_values($replace);
}
// Loop through $search array.
foreach($search as $key => $this_search){
// Don't support multi-dimensional arrays (to match str_replace()).
$this_search = strval($this_search);
// If $replace is an array, use the value of $replace[$key] as the replacement. If
// $replace[$key] doesn't exist, just an empty string (to match str_replace()).
if(is_array($replace)){
if(array_key_exists($key, $replace)){
$this_replace = strval($replace[$key]);
} else {
$this_replace = '';
}
} else {
$this_replace = strval($replace);
}
// Call this function again for
$this_function = __FUNCTION__;
$subject = $this_function(
$this_search,
$this_replace,
$subject,
$this_count,
$limit
);
// Adjust $count
$count += $this_count;
// Adjust $limit, if not -1
if($limit!=-1){
$limit -= $this_count;
}
// Reached $limit, return $subject
if($limit===0){
return $subject;
}
}
return $subject;
} else {
$search = strval($search);
$replace = strval($replace);
// Get position of first $search
$pos = strpos($subject, $search);
// Return $subject if $search cannot be found
if($pos===false){
return $subject;
}
// Get length of $search, to make proper replacement later on
$search_len = strlen($search);
// Loop until $search can no longer be found, or $limit is reached
for($i=0;(($i<$limit)||($limit===-1));$i++){
// Replace
$subject = substr_replace($subject, $replace, $pos, $search_len);
// Increase $count
$count++;
// Get location of next $search
$pos = strpos($subject, $search);
// Break out of loop if $needle
if($pos===false){
break;
}
}
// Return new $subject
return $subject;
}
}
E_USER_WARNING
A는 전역, 경고 , 하지 오류 . 역 추적은 어떤 코드가 유효하지 않은 데이터를 함수에 먼저 전달하는지 (생산에서 버그를 추적하는 데 절대적으로 필요함) 알아내는 데 매우 유용합니다. 반환으로 $subject
대신 false
/ null
또는 단순히 내 사용 사례에 대한 개인의 선택이었다 오류를 던지고. str_replace()
의 기능 과 일치하려면 잡을 수있는 치명적인 오류를 사용하는 것이 가장 좋습니다 str_replace()
.
preg_replace()
. 또한 preg_replace()
/ regex는 비정규 함수가 우아하게 제공하지 않는 단어 경계 처리 (원하는 경우)를 제공합니다.
내 테스트 결과에 따르면 karim79에서 제공하는 regular_express에 투표하고 싶습니다. (지금 투표 할만큼 평판이 좋지 않습니다!)
zombat의 솔루션은 너무 많은 함수 호출을 사용하며 코드를 단순화합니다. PHP 5.4를 사용하여 두 가지 솔루션을 100,000 번 실행했으며 결과는 다음과 같습니다.
$str = 'Hello abc, have a nice day abc! abc!';
$pos = strpos($str, 'abc');
$str = substr_replace($str, '123', $pos, 3);
==> 1.85 초
$str = 'Hello abc, have a nice day abc! abc!';
$str = preg_replace('/abc/', '123', $str, 1);
==> 1.35 초
보시다시피 preg_replace의 성능은 많은 사람들이 생각하는 것만 큼 나쁘지 않습니다. 따라서 정규 표현이 복잡하지 않으면 고급 솔루션을 제안합니다.
$pos
위해 false
, 그래서 바늘이 건초 더미에 존재하지 않을 때, 그것은 출력을 손상시킬 수 있습니다.
zombat의 답변 (최고의 답변이라고 생각)을 확장 $limit
하기 위해 교체 할 발생 수를 지정하는 매개 변수를 사용하는 재귀 버전의 함수를 만들었습니다 .
function str_replace_limit($haystack, $needle, $replace, $limit, $start_pos = 0) {
if ($limit <= 0) {
return $haystack;
} else {
$pos = strpos($haystack,$needle,$start_pos);
if ($pos !== false) {
$newstring = substr_replace($haystack, $replace, $pos, strlen($needle));
return str_replace_limit($newstring, $needle, $replace, $limit-1, $pos+strlen($replace));
} else {
return $haystack;
}
}
}
$start_pos
문자열 길이를 초과하면이 함수는 다음을 생성 Warning: strpos(): Offset not contained in string...
합니다. 이 기능이 $start_pos
길이를 초과 하면 교체하지 못합니다 . 실패 증명 : 3v4l.org/qGuVIR ... 함수는 return $haystack
조건을 결합하고 다음 과 같은 단일 사용 변수 선언을 피할 수 있습니다 . 3v4l.org/Kdmqp 그러나이 페이지의 다른 부분에서 언급 한 것처럼 오히려 매우 깨끗하고 직접적인 비 재귀 preg_replace()
호출을 사용하십시오.
else
한 Statment$start_pos > strlen($haystack) ? $start_pos = strlen($haystack) : '';
끈
$string = 'OOO.OOO.OOO.S';
$search = 'OOO';
$replace = 'B';
//replace ONLY FIRST occurance of "OOO" with "B"
$string = substr_replace($string,$replace,0,strlen($search));
//$string => B.OOO.OOO.S
//replace ONLY LAST occurance of "OOOO" with "B"
$string = substr_replace($string,$replace,strrpos($string,$search),strlen($search))
//$string => OOO.OOO.B.S
//replace ONLY LAST occurance of "OOOO" with "B"
$string = strrev(implode(strrev($replace),explode(strrev($search),strrev($string),2)))
//$string => OOO.OOO.B.S
단일 문자
$string[strpos($string,$search)] = $replace;
//EXAMPLE
$string = 'O.O.O.O.S';
$search = 'O';
$replace = 'B';
//replace ONLY FIRST occurance of "O" with "B"
$string[strpos($string,$search)] = $replace;
//$string => B.O.O.O.S
//replace ONLY LAST occurance of "O" with "B"
$string[strrpos($string,$search)] = $replace;
// $string => B.O.O.B.S
substr_replace()
기술 모두 검색 값이 없으면 입력 문자열을 손상시킵니다. 실패의 증거 : 3v4l.org/HmEml (그리고 모두와 마지막 기술 rev
통화가 심각하게 눈에 / 하드 뒤얽힌됩니다.)
사람들이 말한 것을 보완하면 전체 문자열이 배열임을 기억하십시오.
$string = "Lorem ipsum lá lá lá";
$string[0] = "B";
echo $string;
"보렘 ipsum lá lá lá"
á
. 실패의 데모
string
사용하여 멀티 바이트 문자열 인지 확인할 수 있습니다.mb_strlen($subject) != strlen($subject)
이 기능은 @renocor의 답변에서 많은 영향을 받았습니다. 함수를 멀티 바이트 안전하게 만듭니다.
function str_replace_limit($search, $replace, $string, $limit)
{
$i = 0;
$searchLength = mb_strlen($search);
while(($pos = mb_strpos($string, $search)) !== false && $i < $limit)
{
$string = mb_substr_replace($string, $replace, $pos, $searchLength);
$i += 1;
}
return $string;
}
function mb_substr_replace($string, $replacement, $start, $length = null, $encoding = null)
{
$string = (array)$string;
$encoding = is_null($encoding) ? mb_internal_encoding() : $encoding;
$length = is_null($length) ? mb_strlen($string) - $start : $length;
$string = array_map(function($str) use ($replacement, $start, $length, $encoding){
$begin = mb_substr($str, 0, $start, $encoding);
$end = mb_substr($str, ($start + $length), mb_strlen($str), $encoding);
return $begin . $replacement . $end;
}, $string);
return ( count($string) === 1 ) ? $string[0] : $string;
}
이것을 사용할 수 있습니다 :
function str_replace_once($str_pattern, $str_replacement, $string){
if (strpos($string, $str_pattern) !== false){
$occurrence = strpos($string, $str_pattern);
return substr_replace($string, $str_replacement, strpos($string, $str_pattern), strlen($str_pattern));
}
return $string;
}
php.net 에서이 예제를 찾았습니다.
용법:
$string = "Thiz iz an examplz";
var_dump(str_replace_once('z','Z', $string));
산출:
ThiZ iz an examplz
이렇게하면 성능이 약간 저하 될 수 있지만 가장 쉬운 솔루션입니다.
strpos()
). 페이지에 새로운 값을 추가하지 않기 때문에 하향 조정됩니다.
문자열에 멀티 바이트 문자가 포함되어 있지 않고 하나의 문자 만 바꾸려면 간단히 사용할 수 있습니다 strpos
오류를 처리하는 함수
/**
* Replace the first occurence of given string
*
* @param string $search a char to search in `$subject`
* @param string $replace a char to replace in `$subject`
* @param string $subject
* @return string
*
* @throws InvalidArgumentException if `$search` or `$replace` are invalid or if `$subject` is a multibytes string
*/
function str_replace_first(string $search , string $replace , string $subject) : string {
// check params
if(strlen($replace) != 1 || strlen($search) != 1) {
throw new InvalidArgumentException('$search & $replace must be char');
}elseif(mb_strlen($subject) != strlen($subject)){
throw new InvalidArgumentException('$subject is an multibytes string');
}
// search
$pos = strpos($subject, $search);
if($pos === false) {
// not found
return $subject;
}
// replace
$subject[$replace] = $subject;
return $subject;
}
여기 약간 수정 된 str_replace () 함수 를 감싸기 위해 만든 간단한 클래스가 있습니다.
우리의 php :: str_rreplace () 함수를 사용하면 문자열의 마지막 X 인스턴스 만 바꾸려고 할 때 매우 유용한 리버스의 제한된 str_replace ()를 수행 할 수 있습니다.
이 예제는 모두 preg_replace ()를 사용 합니다 .
<?php
class php {
/**
* str_replace() from the end of a string that can also be limited e.g. replace only the last instance of '</div>' with ''
*
* @param string $find
* @param string $replace
* @param string $subject
* @param int $replacement_limit | -1 to replace all references
*
* @return string
*/
public static function str_replace($find, $replace, $subject, $replacement_limit = -1) {
$find_pattern = str_replace('/', '\/', $find);
return preg_replace('/' . $find_pattern . '/', $replace, $subject, $replacement_limit);
}
/**
* str_replace() from the end of a string that can also be limited e.g. replace only the last instance of '</div>' with ''
*
* @param string $find
* @param string $replace
* @param string $subject
* @param int $replacement_limit | -1 to replace all references
*
* @return string
*/
public static function str_rreplace($find, $replace, $subject, $replacement_limit = -1) {
return strrev( self::str_replace(strrev($find), strrev($replace), strrev($subject), $replacement_limit) );
}
}
$str = "Hello there folks!"
$str_ex = explode("there, $str, 2); //explodes $string just twice
//outputs: array ("Hello ", " folks")
$str_final = implode("", $str_ex); // glues above array together
// outputs: str("Hello folks")
추가 공간이 하나 더 있지만 내 경우에는 backgound 스크립트와 마찬가지로 중요하지 않았습니다.
이것이 나의 첫 번째 대답입니다, 나는 그것을 올바르게하기를 바랍니다. 이 문제에 대해 str_replace 함수의 네 번째 인수를 사용하지 않는 이유는 무엇입니까?
mixed str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] )
count : 통과 한 경우 수행 된 교체 횟수로 설정됩니다.
편집 : str_replace 의 네 번째 매개 변수는 대체 횟수를 지정하는 변수 이기 때문에이 답변은 잘못 되었습니다. 이것은 preg_replace 와 일치하지 않습니다. 이것은 4 번째 매개 변수 $limit
와 5 번째 매개 변수가 &$count
있습니다.
(카운트 값을 제공하여) 첫 번째 또는 첫 번째 인스턴스 만 교체 할 솔루션을 쉽게 찾을 수 있습니다. 마지막 또는 마지막 몇 인스턴스를 대체 할 솔루션이 많지 않습니다.
str_replace ($ find, $ replace, $ subject, -3)와 같은 것이 마지막 세 인스턴스를 대체해야 할 수도 있습니다.
어쨌든, 단지 제안.
s($subject)->replaceFirst($search)
와s($subject)->replaceFirstIgnoreCase($search)
도움은 발견 이 독립 라이브러리 .