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

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

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

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!!!

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


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

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.


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.

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.


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


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

2

Versi singkat:

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

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'

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.