Я думаю, что лучше всего сделать это с помощью регулярного выражения и обычного кода.Эта функция проверяет, соответствует ли вся строка шаблону чисел или диапазонов, разделенных запятыми, затем извлекает отдельные числа или диапазоны и применяет к ним другую проверку ошибок (от 1 до 31, конец> = начало):
function validate_range($range) {
if (!preg_match('/^((\d+(?:-\d+)?)(?:,(?!$)|$))+$/', $range)) return false;
preg_match_all('/(\d+(?:-\d+)?)/', $range, $matches);
foreach ($matches[1] as $match) {
if (strpos($match, '-') !== false) {
list($start, $end) = explode('-', $match);
if ($end < $start) return false;
if ($start < 1 || $start > 31 || $end < 1 || $end > 31) return false;
}
if ($match < 1 || $match > 31) return false;
}
return true;
}
Вы можете проверить это так:
$ranges = array(
'4,31,2-22,8',
'29,1-10,2-12,9',
'4,31,2-22,8,',
'29,1-10,-2-12-,9',
'29,1-50,12-2,32');
foreach ($ranges as $range) {
if (validate_range($range))
echo "$range is OK!\n";
else
echo "$range is no good\n";
}
Вывод:
4,31,2-22,8 is OK!
29,1-10,2-12,9 is OK!
4,31,2-22,8, is no good
29,1-10,-2-12-,9 is no good
29,1-50,12-2,32 is no good
Демонстрация на 3v4l.org