Heim > Backend-Entwicklung > PHP-Tutorial > Regelmäßiger Abgleich von Passwörtern, noch eine Frage: Warum sind reguläre Ausdrücke ineffizient?

Regelmäßiger Abgleich von Passwörtern, noch eine Frage: Warum sind reguläre Ausdrücke ineffizient?

WBOY
Freigeben: 2016-08-26 10:12:52
Original
1351 Leute haben es durchsucht

Die Regeln lauten wie folgt:
Passwortformat: 6-16-stellige alphanumerische Kombination
Enthält keine Sonderzeichen.
Muss 3 Zeichen enthalten, einschließlich Zahlen, Großbuchstaben und Kleinbuchstaben, und Groß- und Kleinschreibung berücksichtigen.
Aufeinanderfolgende 3 oder mehr Ziffern dürfen nicht aufeinanderfolgend sein (z. B. 123, 876)
Aufeinanderfolgende 3 oder mehr Buchstaben dürfen nicht aufeinanderfolgend sein (z. B. abc, cba, aaa, 111, AAA)

<code>echo !preg_match('/\d{3,}|[a-zA-Z]{3,}/', $password);
echo preg_match('/\d+/', $password);
echo preg_match('/[a-z]+/', $password);
echo preg_match('/[A-Z]+/', $password);
echo preg_match('/^([a-zA-Z0-9]){6,16}$/', $password);
</code>
Nach dem Login kopieren

Das Obige sind die Anforderungen und die Lösungen, die ich gefunden habe

Aber ich möchte es immer prägnanter zusammenfassen. Ich hoffe, jemand hat eine bessere Idee.

Noch eine Frage: Warum sind reguläre Ausdrücke ineffizient?

Da es zu kompliziert und ineffizient ist, reguläre Ausdrücke zur Beurteilung aufeinanderfolgender Zahlen und Buchstaben zu verwenden, verwende ich hier den Code, den ich in PHP geschrieben habe. Der erste Test war erfolgreich.

<code>/**
 * 密码格式:6-16位数字字母组合
 * 不包含特殊字符。
 * 必须同时包含数字、大写字母,小写字母3种字符,区分大小写。
 * 连续3位及以上数字不能连续(例如123、876)
 * 连续3位及以上的字母不能连续(例如abc、cba)
 * @param string $password
 * @return boolean 是否匹配
 */
function CheckPassword($password){
    if (strlen($password) > 16 || strlen($password) < 6) {
        return false;
    }

    // ASCII code vallue
    $upperLetter = range(65, 90);
    $lowerLetter = range(97, 122);
    $number = range(48, 57);

    $includeNumber = false;
    $includeUpperLetter = false;
    $includeLowerLetter = false;
    $continuousCharNum = 0;

    for ($i=0; !empty($password[$i]); $i++) {
        // 特殊字符
        if (!in_array(ord($password[$i]), array_merge($upperLetter, $lowerLetter, $number))) {
            return false;
        }
        // 大写字母
        if (!$includeUpperLetter && in_array(ord($password[$i]), $upperLetter)) {
            $includeUpperLetter = true;
        }
        // 数字
        if (!$includeNumber && in_array(ord($password[$i]), $number)) {
            $includeNumber = true;
        }
        // 小写字母
        if (!$includeLowerLetter && in_array(ord($password[$i]), $lowerLetter)) {
            $includeLowerLetter = true;
        }
        if ($i != 0 && !empty($password[$i+1])
            && abs(ord($password[$i]) - ord($password[$i-1])) <= 1 && ord($password[$i]) - ord($password[$i-1]) == ord($password[$i+1]) - ord($password[$i])) {
            return false;
        }
    }
    if ($includeLowerLetter && $includeNumber && $includeUpperLetter) {
        return true;
    } else {
        return false;
    }
}</code>
Nach dem Login kopieren
Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage