2012-12-21 57 views
6

Tôi đang cố gắng tìm ra những gì tôi đang làm sai với quy tắc xác thực này vì quy tắc này nói lỗi này.Quy tắc xác thực biểu mẫu cho regex_match

quy tắc Validation:

$this->form_validation->set_rules('username', 'Username', 'trim|required|xss_clean|regex_match[a-z0-9]'); 

Lỗi:

Severity: Warning
Message: preg_match() [function.preg-match]: Delimiter must not be alphanumeric or backslash

+1

có thể trùng lặp của: http://stackoverflow.com/questions/7660545/delimiter-must-be-be-alphanumer-or-backslash-and-preg-match – RonaldBarzell

+1

Tại sao không chỉ sử dụng quy tắc 'alpha_numeric' thay thế? Xem [Quy tắc xác thực biểu mẫu] (http://ellislab.com/codeigniter/user-guide/libraries/form_validation.html#rulereference) – PhearOfRayne

+0

@Steven Farley vì điều đó sẽ cho phép viết hoa mà tôi không muốn. –

Trả lời

12

Trước tiên, bạn cần phải sửa chữa mô hình của bạn. mô hình của bạn ngay bây giờ là a-z0-9

Nó cần phải có một dấu phân cách bao quanh nó, vì vậy cái gì đó như /a-z0-9/ (Nếu bạn có vấn đề trong CodeIgniter sử dụng delimiters xuyệc ngược, bạn có một số lựa chọn khác: xem The manual page on PCRE delimiters)

Bây giờ bạn có một mẫu phù hợp với một chuỗi với a-z0-9 một nơi nào đó trong đó. Lưu ý rằng nếu bạn đang cố gắng so khớp nó với tư cách là một lớp nhân vật, bạn sẽ cần phải thêm lại nó trong ngoặc đơn để làm cho nó, vì vậy /[a-z0-9]/

Bây giờ tôi sẽ giả định rằng bạn thực sự muốn kiểm tra toàn bộ chuỗi là chữ thường (chữ thường), không chỉ là nó có một ký tự khớp với chữ đó. Trong trường hợp này bạn cần một neo trước, lớp nhân vật của bạn khớp, một công cụ sửa đổi lặp lại (tôi giả sử bạn không muốn khớp một chuỗi rỗng và làm cho nó trở thành một hoặc nhiều), và sau đó một neo để xác định khớp phải mở rộng đến cùng:

/^[a-z0-9]+$/

Bạn thậm chí có thể thiết lập chiều dài tối thiểu bằng cách thay thế niềng răng cho cộng và cung cấp một mức tối thiểu, tối đa (để tối đa ra để cho phép nó được bất kỳ chiều dài lớn hơn min). .. ví dụ /^[a-z0-9]{3,}$

Vì vậy, thông số thứ ba của bạn sẽ sẽ kết thúc như sau:

'trim|required|xss_clean|regex_match[/^[a-z0-9]+$/]'

Trừ rằng đây thực sự sẽ không làm việc trong CodeIgniter rõ ràng (như tháng Ba năm 2011 này là trường hợp anyway), do cách nó xử lý dấu ngoặc bên trong quy tắc xác nhận, vì vậy bạn sẽ cần phải sử dụng gọi lại (see here).

Sử dụng một callback:

Bạn sẽ đặt một hàm như sau trong điều khiển của bạn (hoặc phạm vi khác phù hợp):

public function _usernameRegex($userName) { 
    if (preg_match('/^[a-z0-9]+$/', $userName)) 
    { 
    return TRUE; 
    } 
    else 
    { 
    return FALSE; 
    } 
} 

Sau đó bạn thiết lập các quy tắc để gọi chức năng của bạn:

set_rules('username', 'Username', 'trim|required|xss_clean|callback__usernameRegex'); 

Lưu ý: chức năng được đặt tên với dấu gạch dưới hàng đầu để ngăn truy cập url nếu bạn tạo hàm gọi lại trong bộ điều khiển. Có một cách khác để làm điều này bằng cách tạo ra một lớp mở rộng lớp CI_Form_validation, nhưng điều đó dường như là một giải pháp phức tạp hơn. Nếu bạn đặt tên cho hàm có dấu gạch dưới hàng đầu, hãy nhớ rằng bạn phải sau đó bao gồm trong quy tắc của bạn, kết quả là callback__usernameRegex có tổng số hai dấu gạch dưới: một cho tiền tố callback_ và thứ hai cho tên hàm, _usernameRegex.Điều này có thể hoàn toàn đơn giản và không cần chỉ ra cho bạn, nhưng đối với tôi, nó có vẻ giống như một thứ có thể dễ dàng bỏ qua. Xem câu trả lời được liên kết cho Adding custom callback to Codeigniter Form Validation để biết giải thích chi tiết về việc mở rộng CI_Form_validation. Lưu ý rằng nếu bạn mở rộng xác nhận biểu mẫu, bạn không cần phải nối thêm hàm của mình với callback_ khi bạn tham chiếu nó trong set_rules.

Bạn cũng có thể thiết lập các thông điệp cho callback mới của bạn:

$this->form_validation->set_message('usernameRegex', 'The %s field must only contain lowercase letters and/or numbers');


Các tuyến đường thay thế là thay đổi mô hình phù hợp riêng CodeIgniter đã sử dụng trên các quy tắc form_validation. Các liên kết đến diễn đàn của Ellislab mô tả vấn đề và sau đó là một cách tiềm năng để làm việc xung quanh nó further down the thread. Từ việc xem xét mã Codeigniter và sửa lỗi được chỉ định, giải pháp được đề xuất có thể phá vỡ bằng cách sử dụng mảng trong quy tắc: regex tốt hơn để thay thế hàm trong hàm Codeigniter bằng cách sử dụng kết hợp đệ quy sẽ giải quyết cả hai, nhưng có thể gặp phải vấn đề về hiệu năng quy tắc.

Kết hợp mẫu mã vạch cho quy tắc form_validation được tìm thấy trong tệp hệ thống/thư viện/Form_validation.php của nó, trên dòng 115 là 2.1.3. preg_match

+1

Bạn cần đặt/bên trong ký tự [] vì codeigniter mong đợi cụm từ thông dụng sẽ được bao quanh bởi []. –

+0

Đó là một đánh bắt tốt và sai lầm của tôi liên quan đến cách Codeigniter hoạt động =) Nên được cố định ngay – taswyn

+0

Tốt bắt trên biểu thức thường xuyên thực tế không phải là trong một lớp nhân vật –

0

php muốn biểu hiện thường xuyên của bạn được bao quanh bởi một nhân vật phi alpha-số (thường là tất cả mọi người sử dụng /), thay đổi setRules của bạn() như sau:

$this->form_validation->set_rules('username', 'Username', 'trim|required|xss_clean|regex_match[/a-z0-9/]'); 
Các vấn đề liên quan