Ten kod jest bez sensu.
Jeśli chcesz dopuścić zarówno liczby z przecinkeim, jak i bez to:
if(!empty($_POST['cena'])) {
if (!preg_match('/^[0-9]+\.[0-9]{1,2}+$/ ', $_POST['cena']) AND
!preg_match('/^[0-9]+$/', $_POST['cena'])) {
echo "Zła wartoć <b>$cena_zl</b> zł.<br>"; }
}
Ustęp o nieujemnych cenach jest niepotrzebny, ponieważ te 2 warunki przepuszczają tylko KROPKĘ i wyłącznie w formacie
liczba.liczba, a
minusa już nie przepuści..
Robienie osobnych preg_match dla liczb z 1 miejscem po przecinku i z dwoma, też nie ma sensu, bo {1,2} ten zapis dopuszcza zarówno pierwszy, jak i drugi format.
Warunek, który dałeś w 7 linii wykluczył możliwość sprawdzenia liczb, zawierających wartości dziesiętne, gdyż nie dopuszczał liczb z kropką.
Tutaj jest ta tematyka dobrze opisana:
Podstawy wyrażeń regularnych