tags:

views:

79

answers:

7

I want user only input 0-9 and only once "."

 patt = /[^0-9(.{1})]/

 1.2222 -> true
 1.2.2  -> false (only once '.')

help me , thank !

+2  A: 

You can use is_numeric() with the caveat that it accepts a bit more than one usually wants (e.g. 1e4).

Pekka
A: 

Why not just use is_numeric if you're not experienced with regular expressions.

As to your regex: . matches all characters, \. matches a dot. {1} is not necessary. And I have no clue what you're trying to do with [^ ... ]. Read the regular expressions tutorial if you really want to use regular expressions somewhere in your code.

AndiDog
+1  A: 

Why not use http://php.net/manual/en/function.is-float.php ? But anyhow, the RegEx would be ^[\d]+(|\.[\d]+)$ have fun!

Hannes
+3  A: 
/^-?(?:\d+|\d*\.\d+)$/

This matches normal floats e.g. 3.14, shorthands for decimal part only e.g. .5 and integers e.g. 9 as well as negative numbers.

Core Xii
You need to enclose the alternation in parentheses, or else the start-of-string anchor will only be enforced with integers, and the end-of-string anchor only with decimals.
Tim Pietzcker
Good catch, fixed.
Core Xii
+3  A: 

this is what you're looking for

$re = "~        #delimiter
    ^           # start of input
    -?          # minus, optional
    [0-9]+      # at least one digit
    (           # begin group
        \.      # a dot
        [0-9]+  # at least one digit
    )           # end of group
    ?           # group is optional
    $           # end of input
~xD";

this only accepts "123" or "123.456", not ".123" or "14e+15". If you need these forms as well, try is_numeric

stereofrog
+1 for step by step commenting
alex
A: 

Regular Expressions are for matching string patterns. If you are not explicitly after validating the input string's format (but the actual value), you can also use

filter_var("1.33", FILTER_VALIDATE_FLOAT);

to make sure the input can be used as a float value. This will return FALSE if it is not a float and the float or integer value otherwise. Any type juggling rules apply.

Gordon
This does not fit the OPs requirements/description: e.g. it allows `123e-4`
salathe
@salathe yes, like I said: use it when you are after the *value*. Dont use it if you are after validating the *string format*. `123e-4` is still a float (`0.123`).
Gordon
A: 

This regex:

\d*(?:\.\d+)?

will give results:

123 -> true
123.345 -> true
123. -> true
.345 -> true
0.3345 -> true

However, you must check emptiness of the input before using it because the regex also permit zero-length input.

Vantomex