PHP Bir String bir String son kez değiştirilsin mi?


Yanıtlar:


228

Bu işlevi kullanabilirsiniz:

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

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

    return $subject;
}

Ne olursa olsun bu hala doğruydu. Bunu şu şekilde değiştirmeyi düşünün: if ($ pos) {$ Subject = substr_replace ($ Subject, $ replace, $ pos, strlen ($ search)); $ konu döndür; } else {dönüş yanlış; }
— Jazzy

4
@ Jason Ne TRUEolursa olsun geri dönmez . Ne olursa olsun bir dize döndürür. Bir değiştirme yapılamıyorsa orijinali döndürür $subject, tıpkı beğen substr_replace ve str_replaceyap.
— Mischa

@Mischa Bu durumda aynı şey değil mi? ! Str_lreplace gibi bir şey yapmaya çalışıyordum, ancak yanlış döndürmezse, doğru olarak kabul edilir, değil mi? Her iki durumda da, bu bana yardımcı oldu ve takdir ediyorum. Teşekkürler.
— Jazzy

1
Bu nasıl çalışır? strpos — Find the position of the first occurrence of a substring in a string- düzenle: vay. Php dehaları gerçekten denilen bir işlev yaptı strposve strrpos? Teşekkürler ....
— BarryBones41

1
@Barry bu PHP suçu hak etmiyor bir vaka :-) isimler on yıllardır süren desenli olan strstr, strrstrstandart C kütüphanesinin, aynı işlevleri vardır. (Ama adı değiştirmek zorundalar mıydı ?)
— alexis

30

Başka bir 1-astar ama preg olmadan:

$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, kabul edilen çözelti bu çözeltiden kabaca% 35 daha hızlıdır.
— 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

Bence en havalı çözüm ve hala anlamak kolay.
— Blackbam

Neden ters çevrilmiş tüm dizelerle çalışır? Düzenli ifadeler kullanırken bazı (varsayalım) belirli bir performans kazancı var mı?
— Kamafeather

Hayır, aslında performansı düşürür, ancak bunun nedeni yalnızca son tekrarlamayı istemenizdir, böylece aramayı
— birle sınırlandırırsınız

15

Aşağıdaki oldukça kompakt çözüm , ilgilenilen alt dizenin son oluşumunu, yani aynı alt dizenin başka herhangi bir örneğini izlemeyen alt dizinin bir oluşumunu eşleştirmek için PCRE pozitif ileriye dönük iddiasını kullanır . Bu nedenle, örneğin yerine last 'fox'ile'dog' .

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

ÇIKTI: 

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

5
Fikir iyi, ama kod değil. $string = 'The quick brown fox, fox, fox jumps over the lazy fox!!!'; echo preg_replace('/(fox(?!.*fox))/', 'dog', $string);
— Roemer

Aslında, gönderdiğim kod sonuncusu hariç "tilki" tüm örneklerini "köpek" olarak değiştirir, ama istediğimiz tam tersi. ? =? İle değiştirildiğine dikkat ettiğiniz için teşekkür ederiz. sorunu çözer.
— John Sonderson

11

Bunu yapabilirsin:

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

Sonuç 'Merhaba John';

Saygılarımızla


4
Bu, tekrarlanan karakterler olmadığı sürece çalışır. Benim durumumda "2015-12 / 2" var ve tüm "ve tüm 2 kapalı alır" 2015-1 "olmak üzere arşiv tarihi sayfa numarası çizgili.
— Mike

Bu yalnızca en son aranan son sözcükse ve bundan sonra ek karakter içermiyorsa çalışır.
— AwesomeGuy

Bu işe yaramıyor çünkü rtrimdüşündüğünüz gibi davranmıyor. Arama dizesinde var olan karakterleri hangi sırada olursa olsun (ve her zaman değiştirmeyi ekler), örneğin "Merhaba kelime" -> "Merhaba John", "Merhaba efendim" -> "Merhaba John", "Merhaba motor "->" Merhaba motJohn "," Merhaba dünyevi "->" Merhaba worldyJohn ".
— Jake

5

Bu da işe yarayacaktır:

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

GÜNCELLEME Biraz daha özlü sürüm ( http://ideone.com/B8i4o ):

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

Yanlış mı yapıyorum? Eğer öyleyse beni görmezden gel :) echo str_lreplace ("x", "y", "bu x veya bu x"); => Çıktı: "y" Bkz: ideone.com/UXuTo
— edorian

@ edorian: Hata! Üzgünüz, aceleyle doğru sürümün burada olduğunu söyledim : ideone.com/vR073 .
— Alix Axel

5

Sadece bir satır kod (geç cevap ama eklemeye değer):

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

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

$ ile biten dizenin sonunu belirtir.


5

Bu eski bir soru, ama neden herkes en basit normal ifadeye dayalı çözümü gözden kaçırıyor? Normal regexp niceleyicileri açgözlü, insanlar! Bir desenin son örneğini bulmak istiyorsanız .*, önüne yapıştırın . Bunu nasıl yapacağınız aşağıda açıklanmıştır:

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

Bu , "tilki" nin son örneğinin olması gerektiği gibi "ÖRDEK" olarak değiştirilir ve yazdırılır:

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

1
Teşekkürler! Bunu başarmak için ifademi sarmak için mükemmel bir işlev. Benim durumumda, son virgül yerine "," yazıyorum. Sevindim bu cevap listesinde biraz aşağı kaydırdım.
— rlhane

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

echo $string;

Koddaki hataların yanı sıra, Faruk Ünal en iyi anwser'a sahiptir. Bir işlev hile yapar.


$ FindChar öğesinin yanlış olup olmadığını (kabul edilen yanıttaki gibi) kontrol etmeniz gerekir . Dize aranan dize içermiyorsa, bildirim alırsınız ve ilk karakter değiştirilir.
— Shaggy

Bu harika, ama durduğu gibi sadece 1 karakteri 1 karakterle değiştirebilir.
— Pete

3

Son eşleşmeyi bulmak için strrpos () işlevini kullanabilirsiniz.

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

$string[$findChar]=".";

echo $string;

Çıktı: picture_0007.value


2

Kabul edilen cevap için kestirme

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

2

Kısa bir versiyon:

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

0

Dizenin sonuyla eşleşmek için reg ifadesinde "$" kullanın

$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
bu yalnızca son gerçekleşme ideone.com/nbNSNq
— cawecoy

1
Son 'tilki'den sonra başka karakterler belirirse bu çalışmaz.
— John Sonderson

0

İlgilenen için: regix kullanarak sağ taraftan değiştirebilmeniz için preg_match kullanan bir işlev yazdım.

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

Veya her iki seçeneğin kısayol kombinasyonu / uygulaması olarak:

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/3017716 ve https://stackoverflow.com/a/23343396/3017716 tabanlı

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.