Не уверен, что это делает то, что вы хотите ... если нет, уточните, есть ли крайние случаи, которые не совпадают, но на основе ваших примеров это должно работать.
<?php
$code = "123x0001-123x0500";
preg_match("/^\d+x(\d+)-\d+x(\d+)$/", $code, $matches);
echo intval($matches[2]) - intval($matches[1]) + 1;
?>
ВЫХОД:
500
.
<?php
$codes = array("123x0001-123x0500", "123x0021-123x0100", "123x0001-123x0300");
function getDiff($range) {
preg_match("/^\d+x(\d+)-\d+x(\d+)$/", $range, $matches);
return intval($matches[2]) - intval($matches[1]) + 1;
}
foreach ($codes as $code) {
echo getDiff($code) . "\n";
}
?>
OUTPUT
500
80
300
Не уверен, как предполагается рассчитывать значения S, A, B, C. Возможно, вы можете уточнить это.