Зачем использовать регулярное выражение? Почему бы не проверить типы (это не так крошечно, как регулярное выражение, но может быть более семантически уместным)
function is_id($n) {
return is_numeric($n) && floor($n) == $n && $n > 0;
}
is_numeric()
проверяет, что это может быть либо число с плавающей точкой, целое число или число, которое можно преобразовать.
floor($n) == $n
проверяет, является ли оно целым числом.
$n > 0
проверяет, является ли оно больше 0.
Совершено ...