[ad_1]
Saya memiliki string yang berisi kata-kata dan satu atau lebih angka romawi dari satu (I) hingga sepuluh (X).
Saya perlu mengganti angka-angka itu dengan bilangan bulat.
Inilah yang saya coba:
$reps = [ 'I' => 1, 'II' => 2, 'III' => 3, 'IV' => 4, 'V' => 5, 'VI' => 6, 'VII' => 7, 'VIII' => 8, 'IX' => 9, 'X' => 10 ]; $str = "word word VII word ..."; $str2 = str_replace(array_keys($reps), $reps, $str);
Tapi itu tidak berhasil: “VII” diganti dengan “511” bukannya “7”.
Bagaimana cara memperbaikinya?
Apa yang saya coba:
$reps = [ 'I' => 1, 'II' => 2, 'III' => 3, 'IV' => 4, 'V' => 5, 'VI' => 6, 'VII' => 7, 'VIII' => 8, 'IX' => 9, 'X' => 10 ]; $str = "word word VII word ..."; $str2 = str_replace(array_keys($reps), $reps, $str);
Solusi 2
Seperti yang didokumentasikan di PHP: str_replace – Manual[^], str_replace()
pertandingan dari pertama hingga terakhir.
Untuk melakukan apa yang Anda inginkan, Anda harus meletakkan semua string pencarian SEBELUM awalan apa pun, jadi urutannya seperti
IV IX III II I VIII VII VI V X
harus bekerja.
Solusi 3
Selain di atas dan komentar Anda –
Masalah Anda adalah ‘str_replace’ melakukan penggantian sesuai urutan kemunculannya di array Anda seperti yang disebutkan di atas. Anda dapat menggunakan fungsi ‘strtr’ (Fungsi strtr PHP[^]) bersama dengan fungsi penggantian khusus untuk mengembalikan pengganti yang benar, diuji dengan semua item array di dalamnya Editor W3Schools[^] –
<!DOCTYPE html> <html> <body> <?php $reps = [ 'I' => 1, 'II' => 2, 'III' => 3, 'IV' => 4, 'V' => 5, 'VI' => 6, 'VII' => 7, 'VIII' => 8, 'IX' => 9, 'X' => 10 ]; $str = "word word IX word ..."; function replaceNumerals($matches) { global $reps; return $reps[$matches[0]]; } $str2 = preg_replace_callback('/\b(?:' . implode('|', array_map('preg_quote', array_keys($reps))) . ')\b/', 'replaceNumerals', $str); print_r($str2); ?> </body> </html>
Mengembalikan ‘kata kata 9 kata …’
[ad_2]
コメント