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/
Tìm kiếm các hướng dẫn của Google cho Reg Ex –
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
Vì bạn đang gắn thẻ PHP này: http://php.net/manual/en/book.pcre.php –