麻烦问下php这个正则需要怎么写的?

现在我需要密码策略满足几个条件
需要至少一个字母,一个数字,一个特殊字符,然后长度在8-32位
这正则需要怎么写的?

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 13

$password = "Abc123!"; // 替换为你要检查的密码

$pattern = "/^(?=.*[a-zA-Z])(?=.\d)(?=.[!@#$%^&*()-_=+{}[]<>/?]).{8,32}$/";

if (preg_match($pattern, $password)) { echo "密码符合要求"; } else { echo "密码不符合要求"; }

chatgpt写的

1年前 评论

^(?=.*[A-Za-z])(?=.\d)(?=.[@$!%?&])[A-Za-z\d@$!%?&]{8,32}$

1年前 评论
slw415 (作者) 1年前

我认识的正则很难实现这个

正则是按顺序匹配的, 字母、数字、符号出现的顺序可能是不一样的

再加上长度限制,还不如直接 strlen 来的快

PS : 正则的性能也是个问题,如果用正则实现,复杂度应该不低。

Strong Password Checker 强密码检查

1年前 评论
donggan (楼主) 1年前
kis龍 (作者) 1年前
kis龍 (作者) 1年前
donggan (楼主) 1年前
<?php
$password = "Password123@";
$pattern = "/^(?=.*[A-Za-z])(?=.*\d)(?=.*[@#$%^&+=])(?!.*\s).{8,32}$/";

if (preg_match($pattern, $password)) {
    echo "Password is valid";
} else {
    echo "Password is invalid";
}
?>
1年前 评论

<?php

$regex = ‘/^(?=.*[A-Za-z])(?=.\d)(?=.[$@$!%#?&])[A-Za-z\d$@$!%#?&]{8,32}$/‘;

if (preg_match($regex, $password)) {
// 密码合法
} else {
// 密码不合法
}

解释如下:

  • ^ 和 $ 表示密码必须匹配整个字符串,不能只是部分符合
  • (?=.*[A-Za-z]) 表示必须包含至少一个英文字母
  • (?=.*\d) 表示必须包含至少一个数字
  • (?=.*[$@$!%*#?&]) 表示必须包含至少一个特殊符号,这里是 $@%等符号
  • [A-Za-z\d$@$!%*#?&]{8,32} 表示总长度必须在8-32位之间
    这样就可以验证用户输入的密码是否符合复杂规则的要求了。你也可以根据需要调整规则或增加其他限制
1年前 评论

正则不会,这样可以实现,没考虑中文的情况。

/**
 * 包含数字、字母、特殊字符,返回 true,否则返回 false
 *
 * @param $pass
 *
 * @return bool
 */
function password_check($pass)
{
    $len = strlen($pass);
    if ($len < 8 || $len > 32) {
        return false;
    }
    // 在此添加需要的特殊字符
    $special = [
        '!' => true,
        '?' => true,
        '/' => true,
        '>' => true,
        '<' => true,
        ']' => true,
        '[' => true,
        '&' => true,
    ];
    $have_num = $have_char = $have_special = false;
    for ($i = 0; $i < $len; $i++) {
        if (!$have_char && ctype_alpha($pass[$i])) {
            $have_char = true;
        }
        if (!$have_num && ctype_digit($pass[$i])) {
            $have_num = true;
        }
        if (!$have_special && isset($special[$pass[$i]])) {
            $have_special = true;
        }

        if ($have_num && $have_char && $have_special) {
            return true;
        }
    }
    return $have_num && $have_char && $have_special;
}
1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!