Php-如何用整数替换字符串中的罗马数字?


我有一个字符串,其中包含单词和一个或多个从一 (I) 到十 (X) 的罗马数字。
我需要用整数替换这些数字。

这是我尝试过的:

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

但它不起作用:“VII”被“511”代替,而不是“7”。

我该如何修复它?

我尝试过的:

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

解决方案2

如记录于 PHP: str_replace – 手册[^], str_replace() 从第一个到最后一个匹配。
要执行您想要的操作,您需要将所有搜索字符串放在它们的任何前缀之前,因此顺序如下

IV IX III II I VIII VII VI V X

应该管用。

解决方案3

除了上述内容和您的评论之外 –

您的问题是“str_replace”按照它们在数组中出现的顺序执行替换,如上所述。 您可以使用“strtr”函数(PHP strtr 函数[^])以及自定义替换函数以返回正确的替换,并使用中的所有数组项进行测试 W3学校编辑[^] –

超文本标记语言
<!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>

返回“字字9字…”

コメント

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