2010-09-29 45 views
6

Tôi vẫn còn mới sử dụng Cụm từ thông dụng, vì vậy đây là hoàn cảnh của tôi. Tôi có một số quy tắc cho tên người dùng được chấp nhận và tôi đang cố tạo biểu thức cho chúng.Cụm từ thông dụng để xác thực tên người dùng?

Dưới đây là:

  • 1-15 Nhân vật
  • az, AZ, 0-9, và không gian là có thể chấp nhận
  • Phải bắt đầu với az hoặc AZ
  • Không thể kết thúc trong một không gian
  • Không thể chứa hai dấu cách trong một hàng

Đây là như tôi đã đi tten với nó.

/^[a-zA-Z]{1}([a-zA-Z0-9]|\s(?!\s)){0,14}[^\s]$/ 

Phần lớn hoạt động, nhưng không khớp với một ký tự đơn lẻ như "a".

Có ai có thể giúp tôi ở đây không? Tôi đang sử dụng PCRE trong PHP nếu điều đó tạo ra bất kỳ sự khác biệt nào.

+0

Lưu ý rằng '\ s' không chỉ là một không gian mà là bằng '[\ x09 \ x0A \ x0C \ x0D \ x20]'. – Gumbo

+0

Sử dụng công cụ này (http://public.kvalley.com/regex/regex.asp) để xác minh và sửa các biểu thức reg của bạn. –

Trả lời

7

Hãy thử điều này:

/^(?=.{1,15}$)[a-zA-Z][a-zA-Z0-9]*(?: [a-zA-Z0-9]+)*$/ 

Cái nhìn-phía trước khẳng định (?=.{1,15}$) kiểm tra độ dài và phần còn lại sẽ kiểm tra cấu trúc:

  • [a-zA-Z] đảm bảo rằng các ký tự đầu tiên là một ký tự chữ cái;
  • [a-zA-Z0-9]* cho phép bất kỳ số ký tự chữ và số nào sau đây;
  • (?: [a-zA-Z0-9]+)* cho phép bất kỳ số lượng trình tự của một không gian duy nhất (không \s cho phép bất kỳ ký tự khoảng trắng) phải được theo sau bởi ít nhất một ký tự chữ và số (xem PCRE subpatterns for the syntax of (?:…)).

Bạn cũng có thể xóa xác nhận xem trước và kiểm tra chiều dài bằng strlen.

+0

@Bart K .: Cảm ơn. :) – Gumbo

+0

Bạn là một phao cứu sinh! Bạn cũng có thể giải thích thêm một chút về cách nó hoạt động? Tôi vẫn đang học và không ai trong số đó thực sự có ý nghĩa với tôi. – dan

0

Vấn đề chính của regexp của bạn là nó cần ít nhất hai nhân vật hai có một trận đấu:

  • một cho phần [a-zA-Z]{1}
  • một cho [^\s] phần

Bên cạnh vấn đề này, tôi thấy một số phần của regexp của bạn có thể được cải thiện:

  • Lớp [^\s] sẽ khớp với bất kỳ ký tự nào, ngoại trừ dấu cách: dấu chấm hoặc dấu chấm phẩy sẽ được chấp nhận, hãy thử sử dụng lớp [a-zA-Z0-9] ở đây để đảm bảo ký tự là đúng.
  • Bạn có thể xóa phần {1} ngay từ đầu, như regexp sẽ phù hợp chính xác một ký tự theo mặc định
+0

Điều này sẽ khớp các chuỗi với khoảng trắng ở cuối – NullUserException

+0

Bây giờ, nó cũng khớp với các chuỗi kết thúc bằng ký tự khoảng trắng. – Gumbo

+0

@NUE & Gumbo: Cảm ơn, ban đầu tôi không nhận ra. Tôi đã xóa các đề xuất không chính xác và tập trung và các vấn đề của regexp gốc. –

0

làm cho mọi thứ sau ký tự đầu tiên của bạn không bắt buộc

^[a-zA-Z]?([a-zA-Z0-9]|\s(?!\s)){0,14}[^\s]$ 
+0

Điều này cũng sẽ khớp với các chuỗi không bắt đầu bằng '[a-zA-Z]' và không kết thúc bằng '[a-zA-Z0-9]'. – Gumbo

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