罗马数字到字符串中的数字

时间:2018-07-19 10:19:17

标签: php regex roman-numerals

我有这个字符串:

$string = 'Hello IV WorldX';

我想将所有罗马数字替换为整数。

我具有以下函数将罗马转换为整数:

function roman2number($roman){
    $conv = array(
        array("letter" => 'I', "number" => 1),
        array("letter" => 'V', "number" => 5),
        array("letter" => 'X', "number" => 10),
        array("letter" => 'L', "number" => 50),
        array("letter" => 'C', "number" => 100),
        array("letter" => 'D', "number" => 500),
        array("letter" => 'M', "number" => 1000),
        array("letter" => 0, "number" => 0)
    );
    $arabic = 0;
    $state = 0;
    $sidx = 0;
    $len = strlen($roman);

    while ($len >= 0) {
        $i = 0;
        $sidx = $len;
        while ($conv[$i]['number'] > 0) {
            if (strtoupper(@$roman[$sidx]) == $conv[$i]['letter']) {
                if ($state > $conv[$i]['number']) {
                    $arabic -= $conv[$i]['number'];
                } else {
                    $arabic += $conv[$i]['number'];
                    $state = $conv[$i]['number'];
                }
            }
            $i++;
        }
        $len--;
    }
    return($arabic);
}

echo roman2number('IV');

效果很好(请在ideone上尝试)。如何搜索和替换字符串以替换罗马数字的 all 个实例。像这样:

$string = romans_to_numbers_in_string($string);

正则表达式之类的声音需要救援...还是?

1 个答案:

答案 0 :(得分:1)

这是一个匹配罗马数字的简单正则表达式:

\b[0IVXLCDM]+\b

因此,您可以像这样实现romans_to_numbers_in_string:

function romans_to_numbers_in_string($string) {
    return preg_replace_callback('/\b[0IVXLCDM]+\b/', function($m) {
           return roman2number($m[0]);
           },$string);
}

此正则表达式存在一些问题。像,如果您有这样的字符串:

I like roman numerals

它将变为:

1 like roman numerals

根据您的要求,可以顺其自然,也可以修改正则表达式,以便它不会将单I转换为数字。