2011-02-02 34 views
5

Gần đây tôi đã phát hiện ra rằng một phương pháp tôi đã sử dụng để xác thực tính năng nhập của người dùng chấp nhận một số giá trị mà tôi không đặc biệt hài lòng. Tôi cần nó để chỉ chấp nhận số tự nhiên (1, 2, 3, v.v.) mà không có ký tự không phải chữ số.Regex chỉ xác thực số tự nhiên?

Phương pháp của tôi trông như thế này:

function is_natural($str) 
{ 
    return preg_match('/[^0-9]+$/', $str) ? false : $str; 
} 

Vì vậy, nó là nghĩa vụ phải trả về false nếu nó tìm thấy bất cứ điều gì khác ngoài một số tự nhiên nói chung. Vấn đề là, nó chấp nhận chuỗi như "2.3" và thậm chí "2.3,2.2"

+4

Ý bạn là "số tự nhiên nhưng không có chữ số"? Bạn muốn các số không có [chữ số] (http://en.wikipedia.org/wiki/Numerical_digit) như thế nào? –

+0

Regex đó sẽ không khớp với một điểm hoặc dấu phẩy. – Koraktor

+0

tôi sử dụng 'filter_var': http://stackoverflow.com/a/6563394/2165415 thấy bài có –

Trả lời

14

có lẽ bạn có thể làm rõ sự khác biệt giữa một "số" và một "chữ số" ??

Anyways, bạn có thể sử dụng

if (preg_match('/^[0-9]+$/', $str)) { 
    // contains only 0-9 
} else { 
    // contains other stuff 
} 

hoặc bạn có thể sử dụng

$str = (string) $str; 
ctype_digit($str); 
+0

Tôi nghĩ rằng tôi đã hiểu nhầm các chữ số. Nó chỉ cần chấp nhận chữ số. Có vẻ như ctype_digit chỉ chấp nhận chữ số ở dạng chuỗi, tôi cần nó để chấp nhận số nguyên. –

+0

có, ctype_digit() sẽ hoạt động, tuy nhiên lưu ý cách tôi bỏ $ str thành chuỗi trước, vì ctype_digit() sẽ luôn trả về false nếu bạn chuyển số nguyên cho nó. –

+0

ctype_digit() vẫn trả về TRUE trên các chuỗi như '2.2.2.3' –

14

Vấn đề với /^[0-9]+$/ là nó cũng chấp nhận các giá trị như 0123. Cụm từ thông dụng chính xác là /^[1-9][0-9]*$/.

ctype_digit() cũng gặp phải vấn đề tương tự.

Nếu bạn cũng cần bao gồm số không sử dụng regex này thay thế: /^(?:0|[1-9][0-9]*)$/

+1

Không có gì đặc biệt có hại về việc chấp nhận 0123. Kinda phụ thuộc vào những gì anh ta mong đợi tổng thể, những gì anh ta định làm với nó ... nhưng ví dụ,sẽ đánh giá là 123 trong tính toán, vv ... –

+6

Một "số tự nhiên" là mọi số thường từ 1 trở lên (ℕ). Đó là lý do tại sao tôi nghĩ "0123" không hợp lệ. – Koraktor

+0

đúng, nhưng như OP chỉ ra, ông đã nhầm lẫn về định nghĩa. Vì vậy, một lần nữa, nó tóm lại những gì anh ta muốn thực sự sử dụng nó cho .. –

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