2012-11-25 15 views
7

phép nói rằng bạn có các giá trị sau:Làm thế nào để khớp chính xác 3 chữ số trong preg_match của PHP?

123 
1234 
4567 
12 
1 

Tôi đang cố gắng sang phải một preg_match mà sẽ chỉ trả lại đúng với '123' do đó chỉ phù hợp nếu 3 chữ số. Đây là những gì tôi có, nhưng nó cũng phù hợp với 1234 và 4567. Tôi có thể có một cái gì đó sau khi nó quá.

preg_match('/[0-9]{3}/',$number); 

Trả lời

19

gì bạn cần là anchors:

preg_match('/^[0-9]{3}$/',$number); 

Họ biểu thị sự bắt đầu và kết thúc của chuỗi. Lý do bạn cần chúng là kết hợp regex thường cố gắng tìm bất kỳ chuỗi con phù hợp nào trong chủ đề.

Khi bộ mã rambo chỉ ra, $ cũng có thể khớp với ký tự cuối cùng trong một chuỗi, nếu ký tự cuối cùng đó là một dòng mới. Để thay đổi hành vi này (để 456\n không dẫn đến một trận đấu), sử dụng D modifier:

preg_match('/^[0-9]{3}$/D',$number); 

Ngoài ra, sử dụng \z mà luôn luôn phù hợp với cuối của chuỗi, bất kể từ bổ nghĩa (nhờ Ωmega) :

preg_match('/^[0-9]{3}\z/',$number); 

Bạn nói "Tôi cũng có thể có thứ gì đó sau đó". Nếu điều đó có nghĩa là chuỗi bạn nên bắt đầu với đúng ba chữ số, nhưng có thể có bất cứ điều gì sau đó (miễn là nó không phải là chữ số khác), bạn nên sử dụng một lookahead tiêu cực:

preg_match('/^[0-9]{3}(?![0-9])/',$number); 

Bây giờ nó sẽ phù hợp với 123abc, quá. Điều tương tự cũng có thể được áp dụng cho đầu regex (nếu abc123def nên cung cấp cho một trận đấu) sử dụng một lookbehind tiêu cực:

preg_match('/(?<![0-9])[0-9]{3}(?![0-9])/',$number); 

Further reading about lookaround assertions.

+1

Bạn nên thêm 'D' cờ để '$' không thể neo đậu trước một ký tự dòng mới. 'preg_match ('/^[0-9] {3} $ /'," 444 \ n ");' – goat

+1

@rambocoder cảm ơn bạn, bắt tốt! –

+0

'/^[0-9] {3} \ z /' (chữ thường z) –

4

Bạn cần phải neo regex

/^\d{3}$/ 
3

Nếu bạn đang tìm kiếm số có 3 chữ số ở bất kỳ đâu trong văn bản, sau đó sử dụng mẫu regex

/(?<!\d)\d{3}(?!\d)/ 
.210

Tuy nhiên nếu bạn kiểm tra đầu vào là chỉ số có 3 chữ số và không có gì khác, sau đó đi với

/\A\d{3}\z/