$re = '/([[:<:]]M*(C[MD]|D?C{0,3})(X[CL]|L?X{0,3})(I[VX]|V?I{0,3})[[:>:]])/m';
$str = '### match ###
I II III IV V VI VII VIII IX
X XIII XIV XV XVIII XIX
XXV XXVI XXVII XXVII XXIX
XXX XXXIII XXXVIII XXXIX
XL XLII XLV XLVIII XLIX
L LI LII LIII LIV LV LVI LVII LVIII LIX
LX LXVI LXIX LXXIX LXXXV LXXXVIII
XC XCV XCVI XCVII XCIX
C CI CV CIX
CXI CXX CXXX CXXXVIII CXXXIX CXLII CL CLV CLVIII CLX CLXX CLXXX CXC CXCIII CXCVII CXCIX CC CCIII CCVIII CCIX CCXXV CCL CCLXXV CCCLXXV CD CDXXV CDL CDLXXV CDXC
D DIX DCLXVI DCLXXV DCCCXXVIII
CM CMLXXV
M ML MCV MCCCL MD MDCCXXV MDCCCLXXV MCML MCMXCVIII MCMXCIX
MM MMCCCXXV MMCDLXXV MMDL
MMM MMMCCXXVIII MMMCCCXXVIII MMMD
MMMCMXCV MMMCMXCVIII MMMCMXCIX
MMMM MMMMMMMMMCMXCIX MMMMMMMMMMMDCCXXXII
#### do not match ####
VV VVX XVV IIII IIIII IVIVIV XIIX XXXXII VC IIXV IC CXIIL
LVIXXX LIXXX XXXVIIII XXXVV MCVV MLTK IIV IIX IIL IIM IIC CCM
CMD CMDB L0L LOL GG RAF WTF XIIIXCVIIVMC MMIXIII CCCXXXIIX
MCMM MDCCLXXVIIII CCCD CCCXXXIIII MMMMXXXX';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
// Print the entire match result
var_dump($matches);
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for PHP, please visit: http://php.net/manual/en/ref.pcre.php