나는 버전 원하는 str_replace()
그 단지의 첫 번째 항목 대체 $search
의를 $subject
. 이에 대한 쉬운 해결책이 있습니까, 아니면 해키 솔루션이 필요합니까?
답변
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 배 빠름).
답변
그것의 버전은 없지만 해결책은 전혀 해킹되지 않습니다.
$pos = strpos($haystack, $needle);
if ($pos !== false) {
$newstring = substr_replace($haystack, $replace, $pos, strlen($needle));
}
매우 쉽고 정규 표현식의 성능 저하를 줄입니다.
보너스 : 마지막 발생 을 바꾸려면 strrpos
대신에 사용하십시오 strpos
.
답변
편집 : 두 답변이 모두 업데이트되었으며 이제 정확합니다. 함수 타이밍이 여전히 유용하기 때문에 답을 남겨 두겠습니다.
‘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));
}
두 기능의 시간을 정했으며 일치하는 항목이 없으면 첫 번째 기능이 두 배 빠릅니다. 일치하는 것이 발견 될 때 동일한 속도입니다.
답변
어느 것이 가장 빠른지 궁금해서 모두 테스트했습니다.
아래에서 찾을 수 있습니다 :
- 이 페이지에 기여한 모든 기능의 포괄적 인 목록
- 각 구성에 대한 벤치 마크 테스트 (1 만회 이상의 평균 실행 시간)
- 각 답변에 대한 링크 (전체 코드)
모든 기능은 동일한 설정으로 테스트되었습니다.
$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%
답변
불행히도, 나는 이것을 할 수있는 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));
}
답변
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
답변
가장 쉬운 방법은 정규식을 사용하는 것입니다.
다른 방법은 strpos ()를 사용하여 문자열의 위치를 찾은 다음 substr_replace ()를 찾는 것입니다
그러나 나는 정말로 RegExp에 갈 것입니다.