2010-10-15 26 views

Trả lời

3

Bạn có thể sử dụng is_numeric() với thông báo trước rằng nó chấp nhận nhiều hơn một chút so với mức mong muốn (ví dụ: 1e4).

0

Tại sao không chỉ sử dụng is_numeric nếu bạn không có kinh nghiệm với cụm từ thông dụng.

Với regex của bạn: . khớp với tất cả các ký tự, \. khớp với dấu chấm. {1} là không cần thiết. Và tôi không biết bạn đang cố gắng làm gì với [^ ... ]. Đọc số regular expressions tutorial nếu bạn thực sự muốn sử dụng cụm từ thông dụng ở đâu đó trong mã của mình.

20
/^-?(?:\d+|\d*\.\d+)$/ 

Điều này phù hợp với phao bình thường, ví dụ: 3.14, viết tắt chỉ cho phần thập phân, ví dụ: .5 và số nguyên, ví dụ: 9 cũng như số âm.

+1

Bạn cần phải kèm theo các thay đổi trong dấu ngoặc đơn, nếu không thì neo chuỗi bắt đầu sẽ chỉ được thực thi với số nguyên và chuỗi cuối chuỗi chỉ với số thập phân. –

+0

Bắt tốt, cố định. –

+0

Điều này cũng phù hợp với tôi đối với INT. Cảm ơn. – Strabek

14

đây là những gì bạn đang tìm kiếm

$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"; 

này chỉ chấp nhận "123" hoặc "123,456", không phải" .123" hoặc "14e + 15". Nếu bạn cũng cần các biểu mẫu này, hãy thử is_numeric

+6

+1 để nhận xét từng bước – alex

+0

D là gì? – AntonioCS

+0

@AntonioCS nó dành cho dấu phân cách kết thúc $ [ref về PCRE modifiers] (http://php.net/manual/en/reference.pcre.pattern.modifiers.php) 'D (PCRE_DOLLAR_ENDONLY) Nếu công cụ sửa đổi này là thiết lập, một metacharacter đô la trong mẫu chỉ khớp ở cuối chuỗi chủ đề. Nếu không có công cụ sửa đổi này, một đồng đô la cũng khớp ngay trước ký tự cuối cùng nếu nó là một dòng mới (nhưng không phải trước các dòng mới khác).Công cụ sửa đổi này bị bỏ qua nếu m modifier được thiết lập. Không có tương đương với công cụ sửa đổi này trong Perl.' FYI: x là để mở rộng: để chặn bất kỳ ký tự khoảng trắng nào – MediaVince

5

Cụm từ thông dụng dành cho các mẫu chuỗi phù hợp. Nếu bạn không rõ ràng sau khi xác thực định dạng chuỗi đầu vào (nhưng giá trị thực tế), bạn cũng có thể sử dụng

filter_var("1.33", FILTER_VALIDATE_FLOAT); 

để đảm bảo đầu vào có thể được sử dụng làm giá trị float. Điều này sẽ trả lại FALSE nếu nó không phải là một phao và giá trị phao hoặc số nguyên khác. Mọi quy tắc type juggling đều được áp dụng.

+0

Điều này không phù hợp với các yêu cầu/mô tả OPs: ví dụ: nó cho phép '123e-4' – salathe

+0

@salathe yes, như tôi đã nói: sử dụng nó khi bạn theo sau giá trị * *. Không sử dụng nó nếu bạn sau khi xác nhận định dạng * chuỗi *. '123e-4' vẫn là một phao (' 0.123'). – Gordon

1

regex này:

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

sẽ cho kết quả:

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

Tuy nhiên, bạn phải kiểm tra sự trống rỗng của đầu vào trước khi sử dụng nó vì regex cũng cho phép zero-length đầu vào.

Các vấn đề liên quan