2010-09-30 24 views
117

Herkes bir dizenin son geçtiği yeri bir dizede başka bir dizeyle değiştirmenin çok hızlı bir yolunu biliyor mu?PHP String'de bir dizenin son geçtiği yeri değiştirin mi?

Bu işlevi kullanabilirsiniz
+0

['s ($ str) -> replaceLast ($ arama, $ yerine)'] (https://github.com/delight-im/PHP-Str/blob/8fd0c608d5496d43adaa899642c1cce047e076dc/src/Str. php # L305) yardımcı olarak, [bu bağımsız kütüphane] 'de (https://github.com/delight-im/PHP-Str). – caw

cevap

183

:

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

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

    return $subject; 
} 
+6

Güvenliğin iyiliği için, 'strrpos'un false döndürmediğini, aksi halde tamam olmadığını kontrol ederim. – Wrikken

+1

Evet, haklısın. Cevabımı güncelleyeceğim. – Mischa

+0

Bu hala ne olursa olsun doğru geri dönüyordu.Olmayı değiştirmeyi düşünün: if ($ pos) { $ subject = substr_replace ($ konu, $ yerine, $ pos, strlen ($ search)); \t $ konu döndürün; } else { \t false; } – Jazzy

4

Bu aynı zamanda çalışacaktır:

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

UPDATE 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); 
} 
+0

Yanlış mı yapıyorum? Eğer öyleyse sadece beni görmezden gelmeyin :) ||| echo str_lreplace ("x", "y", "bu x veya o x"); => Çıktı: "y" Bakınız: http://www.ideone.com/UXuTo – edorian

+0

@edorian: Oops! Üzgünüz, bunu acele ettim, doğru sürüm burada: http://ideone.com/vR073. –

17
$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 
28

Başka 1-liner ama Süleyman Demirel olmadan:

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

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

Birinin bunu –

+0

FWIW standardına göre karşılaştırmasını görmek eğlencelidir, kabul edilen çözüm bu çözümden yaklaşık% 35 daha hızlıdır. – JustCarty

0

$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' 
+1

Bunun işe yaradığını düşünmüyorum. – crmpicco

+4

bu, yalnızca sonuncu olay dizenin sonundaysa çalışır. Http://ideone.com/nbNSNq – cawecoy

+1

Son 'tilki' den sonra başka karakterler göründüğünde bu çalışmaz. –

5

aşağıdaki ziyade kompakt çözüm eşleştirmek için PCRE positive lookahead assertion kullanan dizenin sonunu eşleştirmek için bir reg ifadeye "$" kullanın İlgilenilen alt-dizinin son meydana gelmesi, yani, aynı alt-tabakanın başka oluşumları tarafından takip edilmeyen alt-tabaka oluşumu. Böylece örnek, last 'fox''un 'dog' ile değiştirilmesini sağlar.

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

ÇIKIŞ:

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

işe yaramıyor görünüyor – Ivan

+3

Fikir iyi, ama kod değil. Olması gereken: '$ string = 'Hızlı kahverengi tilki, tilki, tilki tembel tilki üzerinde atlar!'; echo preg_replace ('/ (tilki (?!. * Tilki)) /', 'köpek', $ dize); ' – Roemer

+0

Gerçekten de, gönderdiğim kod sonuncusu hariç tüm" tilki "örneklerini değiştirir. "köpek", ama istediğimiz tam tersi. Bunun yerine geçtiğini belirttiğin için teşekkür ederim? = Ile?! sorunu giderir. –

2

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

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

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

biten $ dize sonunu gösterir.

7

Bunu yapabilirsiniz:

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

Sonucu 'Merhaba John' olduğu;

Selamlar

+2

Bu, tekrarlanan karakterler olmadıkça çalışır. Benim durumumda, arşiv tarihini sayfa numarasından çıkartıyorum, böylece "2015-12/2" ye sahibim ve tüm/ve hepsini 2 tamamladıktan sonra "2015-1" oluyor. – Mike

1

Sen() son eşleşmeyi bulmak için strrpos kullanabilirsiniz.

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

$string[$findChar]="."; 

echo $string; 

Çıktı: picture_0007.value kodunda hatalarından dışında

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

echo $string; 

Faruk Ünal iyi anwser sahiptir. Bir işlev hile yapar.

+0

** $ findChar ** öğesi yanlış değilse (kabul edilen yanıtta olduğu gibi) kontrol etmeniz gerekir. Dize, aranan dize içermiyorsa, bildirim alırsınız ve ilk karakter değiştirilir. – shaggy

İlgili konular