2012-04-06 24 views
6

Tôi muốn có thể xác thực regex được nhập của người dùng, để kiểm tra xem nó có hợp lệ hay không. Điều đầu tiên tôi tìm thấy với filter_var của PHP với hằng số FILTER_VALIDATE_REGEXP nhưng điều đó không làm những gì tôi muốn vì nó phải vượt qua một regex để các tùy chọn nhưng tôi không regex'ing chống lại bất cứ điều gì về cơ bản nó chỉ kiểm tra hiệu lực regex.Cách xác thực regex bằng PHP

Nhưng bạn có ý tưởng, làm cách nào để xác thực regex đầu vào của người dùng (không khớp với nội dung nào).

Ví dụ chứng thực, nói cách đơn giản:

$user_inputted_regex = $_POST['regex']; // e.g. /([a-z]+)\..*([0-9]{2})/i 

if(is_valid_regex($user_inputted_regex)) 
{ 
    // The regex was valid 
} 
else 
{ 
    // The regex was invalid 
} 

Ví dụ về xác nhận:

/[[0-9]/i    // invalid 
//(.*)/    // invalid 
/(.*)-(.*)-(.*)/  // valid 
/([a-z]+)-([0-9_]+)/i // valid 
+0

Bạn có thể giải thích thêm về ý nghĩa của từ 'phù hợp với nội dung không'? Nó là một chuỗi rỗng? –

+0

Tôi có nghĩa là không có gì là không có biến, tôi không đi qua bất cứ điều gì để xác nhận đối với regex của người dùng. – MacMac

+0

Xin lỗi để đến với vấn đề này một lần nữa, nhưng nếu bạn 'không đi qua bất cứ điều gì để xác nhận đối với regex' của người dùng, làm thế nào bạn có thể xác nhận regexp? Bạn nói trong câu hỏi rằng bạn không muốn kiểm tra tính hợp lệ, vì vậy bạn muốn kiểm tra regexp bằng cái quái gì? –

Trả lời

5

Dưới đây là một ý tưởng (demo):

function is_valid_regex($pattern) 
{ 
    return is_int(@preg_match($pattern, '')); 
} 

preg_match() trả về số lần mô hình phù hợp. Đó sẽ là hoặc 0 lần (không khớp) hoặc 1 lần vì preg_match() sẽ dừng tìm kiếm sau trận đấu đầu tiên.

preg_match() trả về SAI nếu xảy ra lỗi.

Và để biết lý do tại sao mẫu không hợp lệ, hãy sử dụng preg_last_error.

2

Bạn sẽ cần phải viết chức năng riêng của bạn để xác nhận một regex. Bạn có thể xác thực nó cho đến nay để nói liệu nó có chứa các ký tự không hợp lệ hoặc biểu mẫu không đúng, nhưng không có cách nào để kiểm tra xem nó có phải là một biểu thức hoạt động hay không. Cho rằng bạn sẽ cần phải tạo ra một giải pháp.

Nhưng sau đó bạn nhận ra có thực sự là không có điều như một regex không hợp lệ. Một regex là dựa trên hiệu suất. Nó hoặc là phù hợp hoặc nó không và đó là phụ thuộc vào chủ đề của thử nghiệm - ngay cả khi biểu thức hoặc kết quả của nó là dường như vô nghĩa.

Nói cách khác, bạn chỉ có thể thử nghiệm cụm từ thông dụng cho cú pháp hợp lệ ... và điều đó có thể gần như bất cứ điều gì!

+0

Tất nhiên có một điều như một regex không hợp lệ. Lấy "cấu trúc nhóm không đầy đủ" làm ví dụ. –

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