我有这个字符串:
$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);
正则表达式之类的声音需要救援...还是?
答案 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转换为数字。