Вам нужно только проверить с начала строки на наличие 1 или более нулей, за которыми следуют от 1 до 9 ди git. Эта логика c означает, что требуемый шаблон регулярных выражений может быть очень простым.
Код: ( Demo )
$tests = [
'00.12',
'0.12',
'00',
'0',
'0012.12',
'00023',
];
foreach ($tests as $test) {
echo $test . (preg_match('~^0+[1-9]~', $test) ? ' fail' : ' pass') . "\n";
}
Выход:
00.12 pass
0.12 pass
00 pass
0 pass
0012.12 fail
00023 fail
Чтобы исправить ваш полный шаблон, вам не нужен квантификатор в первой группе: ( Demo )
echo preg_match('~^(?:[1-9]\d*|0{1,2})(?:\.\d{2})?$~', $test) ? ' pass' : ' fail'
Но, честно говоря, почему бы не использовать их как плавающие вместо отказа от значений с ведущими нулями? ( Демо ) Я бы, наверное, сделал это для лучшего пользовательского опыта. Или, может быть, просто стандартизировать вводимые числа с помощью number_format()
. ( Демо ) Возможно, здесь звучит проблема XY .