Php – bagaimana cara mengganti angka romawi dalam string dengan bilangan bulat?

pemrograman


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:

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

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 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[^] –

HTML
<!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 …’

コメント

タイトルとURLをコピーしました