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.
Nguồn
2012-11-25 21:54:19
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
@rambocoder cảm ơn bạn, bắt tốt! –
'/^[0-9] {3} \ z /' (chữ thường z) –