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.