2014-07-15 22 views
8

Cảm ơn bạn trước cho bạn thời gian trong việc giúp đỡ với vấn đề này ..preg_match(): Compilation failed: phạm vi không hợp lệ trong lớp ký tự bù đắp 20

preg_match(): Compilation failed: phạm vi không hợp lệ trong lớp nhân vật tại offset 20 session.php trên đường dây 278

tôi không chắc chắn tại sao điều này Ngưng làm việc tất cả của một đột ngột sau nhiều tháng làm việc nó có thể là một bản nâng cấp trong các mã ..

đây là mã

else{ 
    /* Spruce up username, check length */ 
    $subuser = stripslashes($subuser); 
    if(strlen($subuser) < $config['min_user_chars']){ 
     $form->setError($field, "* Username below ".$config['min_user_chars']."characters"); 
    } 
    else if(strlen($subuser) > $config['max_user_chars']){ 
     $form->setError($field, "* Username above ".$config['max_user_chars']."characters"); 
    } 


    /* Check if username is not alphanumeric */ 
    /* PREG_MATCH CODE */ 

    else if(!preg_match("/^[a-z0-9]([0-9a-z_-\s])+$/i", $subuser)){   
     $form->setError($field, "* Username not alphanumeric"); 
    } 


    /* PREG_MATCH CODE */ 


    /* Check if username is reserved */ 
    else if(strcasecmp($subuser, GUEST_NAME) == 0){ 
     $form->setError($field, "* Username reserved word"); 
    } 
    /* Check if username is already in use */ 
    else if($database->usernameTaken($subuser)){ 
     $form->setError($field, "* Username already in use"); 
    } 
    /* Check if username is banned */ 
    else if($database->usernameBanned($subuser)){ 
     $form->setError($field, "* Username banned"); 
    } 
    } 

Trả lời

14

Phạm vi lớp ký tự được xác định bằng cách sử dụng - giữa hai giá trị trong một lớp ký tự ([] trong regex). [0-9] nghĩa là mọi thứ từ 0 đến 9, bao gồm. Trong cụm từ thông dụng trong mã của bạn, bạn có một số phạm vi lớp ký tự, a-z, 0-9. Ngoài ra còn có một lớp học mà bạn có thể không có ý định đặt ở đó, cụ thể là _-\s.

"/^[a-z0-9]([0-9a-z_-\s])+$/i" 
        ^^^^ 

này được apprently không được coi là một loạt nhân vật không hợp lệ trong một số (nhất?) Phiên bản của PCRE (thường xuyên thư viện biểu thức PHP sử dụng), nhưng nó có thể đã thay đổi thời gian gần đây, và nếu thư viện PCRE đã được nâng cấp trên máy chủ, đó có thể là lý do.

Debuggex là một công cụ tốt có thể giúp gỡ lỗi (tốt, thông báo lỗi từ PHP đã cho bạn biết cả hai dòng ký tự bị lỗi, vì vậy ..) như thế này (Tôi không liên kết, chỉ là một cái quạt).

+3

... hoặc bản thân PHP đã được nâng cấp. Theo RegexBuddy, PHP 5.5 yêu cầu dấu gạch ngang được thoát hoặc di chuyển đến cuối danh sách nếu bạn muốn nó khớp với dấu gạch ngang theo chữ. Trước đó, rõ ràng, nó chỉ giả định bạn có nghĩa là bởi vì '_- \ s' không có ý nghĩa như một phạm vi. –

+0

Có, PHP cũng bao gồm một phiên bản PCRE, vì vậy sẽ kết thúc với cùng một vấn đề. Nắm bắt tốt. – MatsLindh

+0

@AlanMoore: một khả năng biết quá ít là đặt dấu gạch nối ngay sau một lớp ký tự viết tắt: '\ s-_' –

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