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?)
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!!!
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.
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);}
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.
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.
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.
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'
s($str)->replaceLast($search, $replace)
bermanfaat, seperti yang ditemukan di perpustakaan mandiri ini .Jawaban:
Anda dapat menggunakan fungsi ini:
sumber
TRUE
apa pun yang terjadi. Ini mengembalikan string apa pun yang terjadi. Jika penggantian tidak dapat dilakukan maka akan mengembalikan yang asli$subject
, sepertisubstr_replace
danstr_replace
lakukan.strpos — Find the position of the first occurrence of a substring in a string
- sunting: wow. Genius Php benar-benar membuat fungsi dipanggilstrpos
danstrrpos
? Terima kasih ....strstr
,strrstr
dari pustaka C standar, yang memiliki fungsi yang sama. (Tetapi apakah mereka harus mengganti nama?)1-liner lain tetapi tanpa preg:
sumber
sumber
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'
.KELUARAN:
sumber
$string = 'The quick brown fox, fox, fox jumps over the lazy fox!!!'; echo preg_replace('/(fox(?!.*fox))/', 'dog', $string);
Anda bisa melakukan ini:
Hasilnya adalah 'Hello John';
Salam
sumber
rtrim
tidak 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 ".Ini juga akan berfungsi:
UPDATE Versi yang lebih ringkas ( http://ideone.com/B8i4o ):
sumber
Hanya satu baris kode (jawaban terlambat tetapi ada baiknya menambahkannya):
ending $ menunjukkan akhir dari string.
sumber
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:Ini akan menggantikan instance terakhir dari "fox" menjadi "DUCK", seperti yang seharusnya, dan mencetak:
sumber
Terlepas dari kesalahan dalam kode, Faruk Unal memiliki server terbaik. Satu fungsi berfungsi.
sumber
Anda dapat menggunakan strrpos () untuk menemukan kecocokan terakhir.
Output: picture_0007.value
sumber
Singkatan untuk jawaban yang diterima
sumber
Versi singkat:
sumber
Gunakan "$" pada ekspresi reg untuk mencocokkan akhir string
sumber
Untuk yang berminat: Saya telah menulis fungsi yang menggunakan preg_match sehingga Anda dapat mengganti dari sisi kanan menggunakan regex.
Atau sebagai kombinasi singkat / implementasi kedua opsi:
berdasarkan https://stackoverflow.com/a/3835653/3017716 dan https://stackoverflow.com/a/23343396/3017716
sumber