con questa mi dà errore sulla stringa 'abcd', in pratica me la trova come falso positivo per 4 volte (una per carattere). Inoltre non funziona se il separatore è la virgola (dagli esempi che ha postato credo che per lui il float sia da considerare tale a prescindere dal separatore)
utilizzerei questa espressione:
che funziona anche per un caso estremo come questocodice:^\d{1,}[.,]{0,1}\d{0,}$
1,2,45
Anche questa va negata (if(!preg_match... ecc ecc)
Il risultato che ho ottenuto è stato questo:
123,123 //float
123.123 //float
123 //float
123$ //non float
abcd //non float
1,2,45 //non float