2010-06-08 34 views
5

Tôi muốn có một biểu thức chính quy mà chỉ cho phép này:Một biểu thức chính quy nhanh chóng cần thiết

letter a-z 
case insensitive 
allows underscores 
allows any nrs 

Làm thế nào nên đây được viết?

Cảm ơn

+0

Không có gì ... Không biết nhiều về regexp –

+0

Ngôn ngữ nào? Tất cả những cái trong thẻ của bạn? –

+0

php, xin lỗi các bạn ... –

Trả lời

7

Đó sẽ là

 
\w 

nếu tôi không nhầm (Khi nó quay ra, nó phụ thuộc: Trong PHP các meaning of \w thay đổi với locale đó là hiện tại có hiệu lực). Bạn có thể sử dụng a more explicit form để móng tay nó xuống:

 
[A-Za-z0-9_] 

tôi sử dụng nó trong bối cảnh, thêm khởi động của dây và end-of-chuỗi anchorsquantifier xác định có bao nhiêu ký tự mà bạn sẽ cho phép:

 
^[A-Za-z0-9_]+$ 
0
if(preg_match('/^[0-9a-z_]+$/i', $string)) { 
    //if it matches 
} 

else { 
    //if it doesn't match 
} 

[0-9a-z_] là một lớp nhân vật xác định các chữ số từ 0 đến 9, các chữ cái từ a đến z và dấu gạch dưới. Các i ở cuối làm cho phù hợp với trường hợp-insensitive. ^$ là các neo khớp với phần đầu và cuối của chuỗi tương ứng. + có nghĩa là 1 hoặc nhiều ký tự.

+2

Sai. Điều này sẽ trả về false dương nếu đầu vào xảy ra chứa một ký tự hợp lệ - ngay cả khi nó cũng chứa các ký tự không hợp lệ. – Matt

+0

Điểm tốt - Tôi đang chỉnh sửa câu trả lời của mình. –

+0

Điều này sẽ không hoạt động. "a b c d" sẽ vượt qua, vì bạn chỉ tìm kiếm một trong các ký tự trong chuỗi để khớp. Sửa đổi mẫu thành '/^[0-9a-z _] $/i' và nó sẽ hoạt động. – ceejayoz

5

PHP:

if (preg_match('/[^a-z0-9_]/i', $input)) { 
    // invalid input 
} else { 
    // valid input 
} 

Vì vậy [a-z0-9_] là một bộ ký tự cho các ký tự hợp lệ của bạn. Thêm ^ vào mặt trước ([^a-z0-9_]) phủ nhận nó. Logic là, nếu bất kỳ ký tự nào khớp với một cái gì đó KHÔNG PHẢI trong bộ ký tự hợp lệ thì đầu vào được coi là không hợp lệ.

Các /i ở cuối làm cho trường hợp không khớp.

+0

+1 - Một số lần regexp dễ dàng hơn để kiểm tra/đọc là phủ định. Thay vì chỉ cho phép một số ký tự nhất định, chỉ cần kiểm tra sự tồn tại của một ký tự không hợp lệ. – gnarf

+0

Nhưng khi mẫu này giống nhau (thanh âm), nó chỉ là vấn đề đảo ngược khối if/else, hoặc đặt '!' Trước 'preg_match'. Phủ nhận giúp bạn dễ dàng hơn khi bạn thay đổi vấn đề, không phải khi bạn viết cùng một mẫu chính xác theo một cách hơi khác. –

1

Làm cách nào để viết? (Phá vỡ nó thành nhiều dòng)

/   # Start RegExp Pattern 
^   # Match beginning of string only 
[a-z0-9_]* # Match characters in the set [ a-z, 0-9 and _ ] * = Zero or more times 
$   # Match end of string 
/i   # End Pattern - Case Insensitive Matching 

Đem lại cho bạn

if (preg_match('/^[a-z0-9_]*$/i', $input)) { 
    // input is valid 
} 

Bạn cũng có thể sử dụng một + thay vì * nếu bạn muốn để buộc ít nhất một nhân vật là tốt.

+1

Trường hợp này có phân biệt chữ hoa chữ thường không? Mã của bạn (không phải là lời giải thích!) –

+0

@Vivin Paliath - Yup! Cảm ơn vì cú huých nhẹ nhàng. – gnarf

+0

Không sao đâu! :) –

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