[ad_1]
Tôi có một chuỗi chứa các từ và một hoặc nhiều chữ số La Mã từ một (I) đến mười (X).
Tôi cần thay thế những chữ số đó bằng số nguyên.
Đây là những gì tôi đã thử:
$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);
Nhưng nó không hoạt động: “VII” được thay thế bằng “511” thay vì “7”.
Làm thế nào tôi có thể sửa chữa nó?
Những gì tôi đã thử:
$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);
Giải pháp 2
Như tài liệu tại PHP: str_replace – Hướng dẫn sử dụng[^], str_replace()
trận đấu từ đầu đến cuối.
Để làm những gì bạn muốn, bạn cần đặt tất cả các chuỗi tìm kiếm TRƯỚC bất kỳ tiền tố nào của chúng, vì vậy một thứ tự như
IV IX III II I VIII VII VI V X
nên làm việc.
Giải pháp 3
Ngoài những điều trên và nhận xét của bạn –
Vấn đề của bạn là ‘str_replace’ thực hiện thay thế theo thứ tự chúng xuất hiện trong mảng của bạn như đã đề cập ở trên. Bạn có thể sử dụng chức năng ‘strtr’ (Hàm strtr của PHP[^]) cùng với hàm thay thế tùy chỉnh để trả về kết quả thay thế chính xác, đã được thử nghiệm với tất cả các mục mảng trong Biên tập viên của 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>
Trả về ‘từ từ 9 từ …’
[ad_2]
コメント