PHP 문자열에서 마지막으로 나타난 문자열을 대체 하시겠습니까?


답변:


228

이 기능을 사용할 수 있습니다 :

function str_lreplace($search, $replace, $subject)
{
    $pos = strrpos($subject, $search);

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

    return $subject;
}

이것은 어쨌든 여전히 사실로 돌아 왔습니다. 다음과 같이 수정하십시오 : if ($ pos) {$ subject = substr_replace ($ subject, $ replace, $ pos, strlen ($ search)); 반환 $ 주제; } else {return false; }
재즈

4
@Jason 그것은 TRUE무엇이든 반환하지 않습니다 . 그것은 무엇이든 문자열을 반환합니다. 교체를 할 수없는 경우는 원본을 반환 $subject, 단지 같은 substr_replace str_replace않습니다.
Mischa

@Mischa이 경우에도 똑같지 않습니까? ! str_lreplace와 같은 작업을 시도했지만 false를 반환하지 않으면 사실로 간주됩니다. 어느 쪽이든, 이것은 나에게 도움이되었고 감사합니다. 감사.
재즈

1
어떻게 작동합니까? strpos — Find the position of the first occurrence of a substring in a string-편집 : 와우. PHP 천재는 실제로 strposand 라는 함수를 만들었습니다 strrpos. 감사합니다 ....
BarryBones41

1
@Barry이 PHP는 비난을받을 자격이없는 한 경우 :-) 이름은 수십 년 된에 패턴 화되어있다 strstr, strrstr표준 C 라이브러리, 동일한 기능입니다. (그러나 그들이했던 이름을 변경?)
알렉시스

30

preg이없는 또 다른 1- 라이너 :

$subject = 'bourbon, scotch, beer';
$search = ',';
$replace = ', and';

echo strrev(implode(strrev($replace), explode(strrev($search), strrev($subject), 2))); //output: bourbon, scotch, and beer

3
FWIW에서 수용된 솔루션은이 솔루션보다 약 35 % 빠릅니다.
JustCarty

27
$string = 'this is my world, not my world';
$find = 'world';
$replace = 'farm';
$result = preg_replace(strrev("/$find/"),strrev($replace),strrev($string),1);
echo strrev($result); //output: this is my world, not my farm

내 의견으로는 가장 멋진 솔루션이며 여전히 이해하기 쉽습니다.
Blackbam

왜 모든 문자열이 반대로 작동합니까? 정규식을 사용할 때 특정 성능 향상이 있습니까?
Kamafeather

실제로는 성능이 저하되지 않지만 마지막 발생만을 원하기 때문에 검색을 하나로 제한하고 처음으로 되돌릴 필요가 없으면 모든 것을 되돌릴 수 있습니다.
Tofandel

15

다음의 다소 컴팩트 한 솔루션은 PCRE 긍정 lookahead 어설 션 을 사용하여 관심있는 부분 문자열의 마지막 항목, 즉 동일한 부분 문자열의 다른 항목이 뒤 따르지 않는 부분 문자열의 항목과 일치시킵니다. 따라서 예는이 대체 last 'fox'와 함께 'dog'.

$string = 'The quick brown fox, fox, fox jumps over the lazy fox!!!';
echo preg_replace('/(fox(?!.*fox))/', 'dog', $string);

산출: 

The quick brown fox, fox, fox jumps over the lazy dog!!!

5
아이디어는 좋지만 코드는 그렇지 않습니다. 그것은해야한다 :$string = 'The quick brown fox, fox, fox jumps over the lazy fox!!!'; echo preg_replace('/(fox(?!.*fox))/', 'dog', $string);
뢰머

사실, 내가 게시 한 코드는 마지막을 "dog"로 제외한 "fox"의 모든 인스턴스를 변경하지만 원하는 것은 정확히 반대입니다. ? =를?로 바꾸는 것을 지적 해 주셔서 감사합니다! 문제를 해결합니다.
John Sonderson

11

당신은 이것을 할 수 있습니다 :

$str = 'Hello world';
$str = rtrim($str, 'world') . 'John';

결과는 'Hello John'입니다.

문안 인사


4
반복되는 문자가없는 한 작동합니다. 내 상황에서 나는 아카이브 날짜에서 페이지 번호를 제거하여 "2015-12 / 2"를 가지고 있으며 끝에서 모든 /와 모두 2가 "2015-1"이됩니다.
Mike

마지막으로 검색 한 단어가 마지막 단어이고 그 뒤에 추가 문자가없는 경우에만 작동합니다.
AwesomeGuy

rtrim당신이 생각하는 방식으로 행동하지 않기 때문에 이것은 작동 하지 않습니다. "Hello word"-> "Hello John", "Hello lord"-> "Hello John", "Hello와 같이 순서에 상관없이 검색 문자열에 존재하는 모든 문자를 끝에서 제거합니다 (항상 대체 문자를 추가합니다). motor "->"Hello motJohn ","Hello worldy "->"Hello worldyJohn "입니다.
Jake

5

이것은 또한 작동합니다 :

function str_lreplace($search, $replace, $subject)
{
    return preg_replace('~(.*)' . preg_quote($search, '~') . '(.*?)~', '$1' . $replace . '$2', $subject, 1);
}

약간 더 간결한 버전 업데이트 ( http://ideone.com/B8i4o ) :

function str_lreplace($search, $replace, $subject)
{
    return preg_replace('~(.*)' . preg_quote($search, '~') . '~', '$1' . $replace, $subject, 1);
}

내가 잘못하고 있습니까? 그렇다면 그냥 무시하십시오 :) ||| echo str_lreplace ( "x", "y", "this x 또는 that x"); => 출력 : "y"참조 : ideone.com/UXuTo
edorian

@edorian : 죄송합니다! 죄송합니다, 서둘러 올바른 버전은 ideone.com/vR073 입니다.
Alix Axel

5

한 줄의 코드 (늦은 대답이지만 추가 할 가치가 있음) :

$string = 'The quick brown fox jumps over the lazy dog';
$find_me = 'dog';

preg_replace('/'. $find_me .'$/', '', $string);

끝 $는 문자열의 끝을 나타냅니다.


5

이것은 고대의 질문이지만 왜 모두가 가장 간단한 정규식 기반 솔루션을 간과합니까? 정규 정규 표현식 수량자는 탐욕 스럽습니다. 패턴의 마지막 인스턴스를 찾으려면 패턴 .*앞에 붙이 십시오. 방법은 다음과 같습니다.

$text = "The quick brown fox, fox, fox, fox, jumps over etc.";
$fixed = preg_replace("((.*)fox)", "$1DUCK", $text);
print($fixed);

다음 과 같이 "fox" 의 마지막 인스턴스를 "DUCK"로 바꾸고 인쇄합니다.

The quick brown fox, fox, fox, DUCK, jumps over etc.

1
감사! 이것을 달성하기 위해 내 표현을 감싸는 완벽한 기능. 필자의 경우 마지막 쉼표를 "및"로 바꿉니다. 이 답변 목록에서 조금 아래로 스크롤하여 다행입니다.
rlhane

3
$string = "picture_0007_value";
$findChar =strrpos($string,"_");
if($findChar !== FALSE) {
  $string[$findChar]=".";
}

echo $string;

코드의 실수 외에도 Faruk Unal은 최고의 답변을 가지고 있습니다. 하나의 기능이 트릭을 수행합니다.


$ findChar 가 false가 아닌지 확인해야합니다 (허용 된 답변과 동일). 문자열에 검색된 문자열이 없으면 통지를 받고 첫 번째 문자가 바뀝니다.
얽히고 설킨

이것은 훌륭하지만, 1 문자 만 1 문자로 바꿀 수 있습니다.
Pete

3

strrpos ()를 사용하여 마지막 일치 항목을 찾을 수 있습니다.

$string = "picture_0007_value";
$findChar =strrpos($string,"_");

$string[$findChar]=".";

echo $string;

출력 : picture_0007.value


2

허용되는 답변의 속기

function str_lreplace($search, $replace, $subject){ 
    return is_numeric($pos=strrpos($subject,$search))?
    substr_replace($subject,$replace,$pos,strlen($search)):$subject;
}

2

짧은 버전 :

$NewString = substr_replace($String,$Replacement,strrpos($String,$Replace),strlen($Replace));

0

문자열의 끝과 일치하도록 reg 표현식에서 "$"를 사용하십시오.

$string = 'The quick brown fox jumps over the lazy fox';
echo preg_replace('/fox$/', 'dog', $string);

//output
'The quick brown fox jumps over the lazy dog'

4
지난 선두로부터 문자열의 끝 부분에있는 경우에만 작동 ideone.com/nbNSNq
cawecoy

1
마지막 'fox'다음에 다른 문자가 나타나면 작동하지 않습니다.
John Sonderson

0

관심을 끌기 위해 : preg_match를 사용하여 정규식을 사용하여 오른쪽에서 바꿀 수있는 함수를 작성했습니다.

function preg_rreplace($search, $replace, $subject) {
    preg_match_all($search, $subject, $matches, PREG_SET_ORDER);
    $lastMatch = end($matches);

    if ($lastMatch && false !== $pos = strrpos($subject, $lastMatchedStr = $lastMatch[0])) {
        $subject = substr_replace($subject, $replace, $pos, strlen($lastMatchedStr));
    }

    return $subject;
}

또는 두 옵션의 속기 조합 / 구현으로 :

function str_rreplace($search, $replace, $subject) {
    return (false !== $pos = strrpos($subject, $search)) ?
        substr_replace($subject, $replace, $pos, strlen($search)) : $subject;
}
function preg_rreplace($search, $replace, $subject) {
    preg_match_all($search, $subject, $matches, PREG_SET_ORDER);
    return ($lastMatch = end($matches)) ? str_rreplace($lastMatch[0], $replace, $subject) : $subject;
}

https://stackoverflow.com/a/3835653/3017716https://stackoverflow.com/a/23343396/3017716 기반

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.