2012-04-18 44 views
5

Tôi có biểu thức này trong đoạn mã tôi đã mượn ngoại tuyến. Nó buộc người dùng mới có mật khẩu không chỉ yêu cầu + số + trên + thấp hơn mà còn phải theo thứ tự đó! Nếu tôi nhập thấp hơn + trên + số, nó không thành công!Các biểu tượng có ý nghĩa gì trong preg_match?

if (preg_match("/^.*(?=.{4,})(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).*$/", $pw_clean, $matches)) { 

Ive đã tìm kiếm trực tuyến nhưng không thể tìm thấy tài nguyên cho tôi biết ý nghĩa của một số ký tự. Tôi có thể thấy rằng mẫu là preg_match ("/ some expression /", chuỗi của bạn, kết quả phù hợp của bạn).

làm gì những bình:

1.^  - ??? 
2. .*   - ??? 
3. (?=.{4,}) - requires 4 characters minimum 
4. (?.*[0-9]) - requires it to have numbers 
5. (?=.*[a-z])- requires it to have lowercase 
6. (?=.*[A-Z])- requires it to have uppercase 
7. .*$  - ??? 
+0

Tìm kiếm các hướng dẫn của Google cho Reg Ex –

+0

Không liên quan đến câu hỏi thực tế của bạn, nhưng buộc mọi người phải có một mẫu quá phức tạp cho mật khẩu có thể sẽ khiến họ viết xuống một nơi nào đó - loại bỏ tính bảo mật của mật khẩu. – jprofitt

+0

Vì bạn đang gắn thẻ PHP này: http://php.net/manual/en/book.pcre.php –

Trả lời

13

Dưới đây là câu trả lời trực tiếp. Tôi giữ chúng ngắn vì chúng sẽ không có ý nghĩa nếu không có sự hiểu biết về regex. Hiểu biết đó đạt được tốt nhất tại regular-expressions.info. Tôi khuyên bạn cũng nên thử các số regex helper tools được liệt kê ở đó, chúng cho phép bạn thử nghiệm - xem tính năng chụp/kết hợp trực tiếp khi bạn chỉnh sửa mẫu, rất hữu ích.


1: dấu mũ ^ là một neo, có nghĩa là "bắt đầu của haystack/string/line".

  • Nếu dấu mũ là biểu tượng đầu tiên bên trong một lớp ký tự [], nó có ý nghĩa khác: Nó loại bỏ lớp. (Vì vậy, trong [^ab] dấu sót làm cho rằng bất cứ điều gì phù hợp với lớp học mà là không ab)

2: Dấu chấm . và dấu hoa thị * phục vụ hai mục đích riêng biệt:

  • Dấu chấm khớp với bất kỳ ký tự đơn ngoại trừ dòng mới \n.
  • Dấu sao cho biết "cho phép không hoặc nhiều loại tiền tố".

Khi hai giá trị này được kết hợp là .*, về cơ bản nó sẽ "không hoặc bất kỳ thứ gì cho đến khi một dòng mới hoặc quy tắc khác có hiệu lực".

7: Đồng đô la $ cũng là một neo giống như dấu mũ, với hàm ngược lại: "kết thúc của đống cỏ khô".


Edit:

ngoặc đơn giản () xung quanh một cái gì đó làm cho nó một nhóm . Tại đây, bạn có (?=) là xác nhận, cụ thể là xác nhận tích cực về phía trước . Tất cả nó là kiểm tra xem những gì bên trong thực sự tồn tại về phía trước từ vị trí con trỏ hiện tại trong haystack. Vẫn còn với tôi?
Ví dụ:foo(?=bar) khớp với foo chỉ khi được theo sau bởi bar. bar không bao giờ phù hợp, chỉ trả lại foo.

Với điều này trong tâm trí, chúng ta hãy phân tích regex của bạn:

/^.*(?=.{4,})(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).*$/ 

Reads as: 
     ^.* From Start, capture 0-many of any character 
    (?=.{4,}) if there are at least 4 of anything following this 
(?=.*[0-9]) if there is: 0-many of any, ending with an integer following 
(?=.*[a-z]) if there is: 0-many of any, ending with a lowercase letter following 
(?=.*[A-Z]) if there is: 0-many of any, ending with an uppercase letter following 
     .*$ 0-many of anything preceding the End 

Bạn nói thứ tự của ký tự mật khẩu quan trọng - nó không trong các thử nghiệm của tôi. Xem tập lệnh thử nghiệm bên dưới. Hy vọng điều này xóa một hoặc hai điều. Nếu bạn đang tìm kiếm một regex mà là tha thứ nhiều hơn một chút, xem regex password validation

<pre> 
<?php 
// Only the last 3 fail, as they should. You claim the first does not work? 
$subjects = array("aaB1", "Baa1", "1Baa", "1aaB", "aa1B", "aa11", "aaBB", "aB1"); 

foreach($subjects as $s) 
{ 
    $res = preg_match("/^.*(?=.{4,})(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).*$/", $s, $matches); 
    echo "result: "; 
    print_r($res); 

    echo "<br>"; 
    print_r($matches); 
    echo "<hr>"; 
} 

công cụ trực tuyến tuyệt vời cho việc kiểm tra và thử nghiệm Regular Expressions: https://regex101.com/

+0

Thx ccondrup. Tôi đoán tôi hiểu lời giải thích của bạn nhưng nếu nó không quá nhiều rắc rối, id giống như một lời giải thích là tại sao biểu thức hoàn chỉnh hoạt động theo cách nó làm phức tạp quá trình xác nhận mật khẩu của tôi rất nhiều ... – marciokoko

+0

Rất vui khi nghe điều đó là dễ hiểu. Tôi đã thêm nhiều câu trả lời của mình, xem liệu câu trả lời đó có giúp ích cho – ccondrup

+0

'preg_match (. *?)' Có nghĩa là gì không? – Neocortex

2

Nếu bạn không biết trang web này, bạn nên đến đó ngay lập tức.

Điều này giống như kinh thánh của cụm từ thông dụng.

Regular-expressions.info

1

Để sử dụng biểu thức thông thường đầu tiên bạn cần phải tìm hiểu những cú pháp . Cú pháp này bao gồm một loạt các chữ cái, số, dấu chấm, dấu gạch nối và dấu hiệu đặc biệt, mà chúng tôi có thể nhóm lại với nhau bằng cách sử dụng các dấu ngoặc đơn khác nhau.

Nhìn vào liên kết này Getting Started with PHP Regular Expressions. Một cách dễ dàng để tìm hiểu các biểu thức chính quy.

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