PHP Ganti kemunculan String terakhir dalam String?

Jawaban:

228

Anda dapat menggunakan fungsi ini:

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

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

    return $subject;
}
Mischa
sumber
Ini tetap kembali benar, apa pun yang terjadi. Pertimbangkan untuk mengubahnya menjadi: if ($ pos) {$ subject = substr_replace ($ subject, $ ganti, $ pos, strlen ($ search)); mengembalikan $ subjek; } else {return false; }
Jazzy
4
@ Alasan Tidak kembali TRUEapa pun yang terjadi. Ini mengembalikan string apa pun yang terjadi. Jika penggantian tidak dapat dilakukan maka akan mengembalikan yang asli $subject, seperti substr_replace dan str_replacelakukan.
Mischa
@Mischa Bukankah itu hal yang sama dalam kasus ini? Saya mencoba melakukan sesuatu seperti! Str_lreplace, tetapi jika itu tidak kembali salah, itu dianggap benar, kan? Bagaimanapun, ini membantu saya dan saya menghargainya. Terima kasih.
Jazzy
1
Bagaimana ini bisa berhasil? strpos — Find the position of the first occurrence of a substring in a string- sunting: wow. Genius Php benar-benar membuat fungsi dipanggil strposdan strrpos? Terima kasih ....
BarryBones41
1
@Barry Ini adalah satu kasus di mana PHP tidak pantas disalahkan :-) Nama-nama berpola pada dekade-lama strstr, strrstrdari pustaka C standar, yang memiliki fungsi yang sama. (Tetapi apakah mereka harus mengganti nama?)
alexis
30

1-liner lain tetapi tanpa preg:

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

echo strrev(implode(strrev($replace), explode(strrev($search), strrev($subject), 2))); //output: bourbon, scotch, and beer
ricka
sumber
3
FWIW, solusi yang diterima kira-kira 35% lebih cepat dari solusi ini.
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
Zack
sumber
Solusi paling keren menurut saya dan masih mudah dimengerti.
Blackbam
Mengapa ia bekerja dengan semua string terbalik? Apakah ada beberapa (saya berasumsi) kenaikan kinerja spesifik saat menggunakan ekspresi reguler?
Kamafeather
Tidak itu benar-benar menurunkan kinerja tetapi itu karena Anda ingin kejadian terakhir hanya jadi Anda membatasi pencarian untuk satu dan membalikkan semua jika Anda ingin yang pertama Anda tidak perlu membalikkan apa pun
Tofandel
15

Solusi yang agak ringkas berikut ini menggunakan pernyataan PCAH positif lookahead untuk mencocokkan kejadian terakhir dari substring yang menarik, yaitu, terjadinya substring yang tidak diikuti oleh kejadian lain dari substring yang sama. Jadi contoh menggantikan last 'fox'dengan 'dog'.

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

KELUARAN: 

The quick brown fox, fox, fox jumps over the lazy dog!!!
John Sonderson
sumber
5
Idenya bagus, tetapi kodenya tidak. Pasti:$string = 'The quick brown fox, fox, fox jumps over the lazy fox!!!'; echo preg_replace('/(fox(?!.*fox))/', 'dog', $string);
Roemer
Memang, kode yang saya posting mengubah semua contoh "rubah" kecuali yang terakhir menjadi "anjing", tetapi yang kita inginkan justru sebaliknya. Terima kasih telah menunjukkan penggantian itu? = Dengan?! memperbaiki masalah.
John Sonderson
11

Anda bisa melakukan ini:

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

Hasilnya adalah 'Hello John';

Salam

Nicolas Finelli
sumber
4
Ini berfungsi selama tidak ada karakter yang diulang. Dalam situasi saya, saya melepaskan nomor halaman dari tanggal arsip sehingga saya memiliki "2015-12 / 2" dan dibutuhkan semua / dan semua 2 dari akhirnya menjadi "2015-1".
Mike
Ini hanya akan berfungsi jika kemunculan terakhir yang dicari adalah kata terakhir dan tidak memiliki karakter tambahan setelahnya.
AwesomeGuy
Ini tidak berhasil karena rtrimtidak berperilaku seperti yang Anda pikirkan. Ini akan menghapus dari ujung karakter apa pun yang ada dalam string pencarian dalam urutan apa pun (dan selalu menambahkan penggantian), misalnya "Halo kata" -> "Hello John", "Hello lord" -> "Hello John", "Hello John", "Hello motor "->" Hello motJohn "," Hello worldy "->" Hello worldyJohn ".
Jake
5

Ini juga akan berfungsi:

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

UPDATE Versi yang lebih ringkas ( http://ideone.com/B8i4o ):

function str_lreplace($search, $replace, $subject)
{
    return preg_replace('~(.*)' . preg_quote($search, '~') . '~', '$1' . $replace, $subject, 1);
}
Alix Axel
sumber
Apakah saya salah? Kalau begitu abaikan saja aku :) ||| echo str_lreplace ("x", "y", "this x or that x"); => Output: "y" Lihat: ideone.com/UXuTo
edorian
@edorian: Ups! Maaf, saya mempostingnya dengan tergesa-gesa, versi yang benar ada di sini: ideone.com/vR073 .
Alix Axel
5

Hanya satu baris kode (jawaban terlambat tetapi ada baiknya menambahkannya):

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

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

ending $ menunjukkan akhir dari string.

jujur
sumber
5

Ini adalah pertanyaan kuno, tetapi mengapa semua orang mengabaikan solusi berbasis regexp yang paling sederhana? Kuantitatif regexp normal serakah, orang-orang! Jika Anda ingin menemukan contoh terakhir dari suatu pola, cukup tempel .*di depannya. Begini caranya:

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

Ini akan menggantikan instance terakhir dari "fox" menjadi "DUCK", seperti yang seharusnya, dan mencetak:

The quick brown fox, fox, fox, DUCK, jumps over etc.
Alexis
sumber
1
Terima kasih! Fungsi sempurna untuk membungkus ekspresi saya untuk mencapai ini. Dalam kasus saya, saya mengganti koma terakhir dengan ", dan". Senang saya sedikit gulir ke bawah dalam daftar jawaban ini.
rlhane
3
$string = "picture_0007_value";
$findChar =strrpos($string,"_");
if($findChar !== FALSE) {
  $string[$findChar]=".";
}

echo $string;

Terlepas dari kesalahan dalam kode, Faruk Unal memiliki server terbaik. Satu fungsi berfungsi.

xwero
sumber
Anda perlu memeriksa, jika $ findChar tidak salah (dengan cara yang sama seperti pada jawaban yang diterima). Jika string tidak mengandung string yang dicari, Anda mendapatkan pemberitahuan dan karakter pertama akan diganti.
Shaggy
Ini hebat, tetapi seperti berdiri, ia hanya dapat mengganti 1 karakter dengan 1 karakter.
Pete
3

Anda dapat menggunakan strrpos () untuk menemukan kecocokan terakhir.

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

$string[$findChar]=".";

echo $string;

Output: picture_0007.value

Faruk ÜNAL
sumber
2

Singkatan untuk jawaban yang diterima

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

Versi singkat:

$NewString = substr_replace($String,$Replacement,strrpos($String,$Replace),strlen($Replace));
Jeffrey si Jerapah
sumber
0

Gunakan "$" pada ekspresi reg untuk mencocokkan akhir string

$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'
Neil Holcomb
sumber
4
ini bekerja hanya jika kejadian terakhir adalah di akhir string ideone.com/nbNSNq
cawecoy
1
Ini tidak akan berfungsi jika ada karakter lain muncul setelah 'rubah' terakhir.
John Sonderson
0

Untuk yang berminat: Saya telah menulis fungsi yang menggunakan preg_match sehingga Anda dapat mengganti dari sisi kanan menggunakan regex.

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

Atau sebagai kombinasi singkat / implementasi kedua opsi:

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

berdasarkan https://stackoverflow.com/a/3835653/3017716 dan https://stackoverflow.com/a/23343396/3017716

Ken
sumber