我正在嘗試preg_match與羅馬數字整數轉換器。問題在於,對於某些輸入,preg_replace似乎給出的匹配太少。代碼:php的preg_match返回不同數量的匹配相同的模式
function romanNumeralToInt($romanNumeral)
{ preg_match
( '/^(M?M?M?)'
.'((CM)|(CD)|((D?)(C?C?C?)))'
.'((XC)|(XL)|((L?)(X?X?X?)))'
.'((IX)|(IV)|((V?)(I?I?I?)))$/', $romanNumeral, $match);
print_r($match);
$result=0;
$result += 1000*strlen($match[1]);
if(strlen($match[3]) != 0){$result += 900;}
if(strlen($match[4]) != 0){$result += 400;}
if(strlen($match[5]) != 0)
{ $result += 100*strlen($match[7]) + 500*strlen($match[6]);
}
if(strlen($match[9]) != 0){$result += 90;}
if(strlen($match[10]) != 0){$result += 40;}
if(strlen($match[11]) != 0)
{ $result += 10*strlen($match[13]) + 50*strlen($match[12]);
}
if(strlen($match[15]) != 0){$result += 9;}
if(strlen($match[16]) != 0){$result += 4;}
if(strlen($match[17]) != 0)
{ $result += 1*strlen($match[19]) + 5*strlen($match[18]);
}
return $result;
}
echo romanNumeralToInt("XXVIII"); // gives correct results
但在「IV」結尾的羅馬數字將切斷的最後3場比賽($比賽將只包含元素0-16而非完整0-19),以及任何類似羅馬數字以「IX」結尾將會截斷最後4場比賽。
這是預期的行爲,還是我的PHP錯誤?
而不是使用正則表達式,你可以嘗試http://pear.php.net/package/Numbers_Roman/。 – 2010-05-12 07:36:57
不是我要做的,我正在用正則表達式使用羅馬數字作爲excersize。感謝壽。 – 2010-05-12 23:09:48