如何在PHP中检查字符串是否至少包含一个字母、数字和特殊字符

23

我正在编写一个小脚本,检查每个字符串的内容。

我想知道如何编写REGEX来确保一个字符串包含字母(大写或小写)、数字和特殊字符?

这是我的一些了解(并不多):

if(preg_match('/^[a-zA-Z0-9]+$/i', $string)):

需要帮助,谢谢!


2
请定义您所说的“特殊字符”是什么意思。 - Andreas Wong
6个回答

57

最简单(也可能是最好的)方法是使用preg_match进行三次分别检查:

$containsLetter  = preg_match('/[a-zA-Z]/',    $string);
$containsDigit   = preg_match('/\d/',          $string);
$containsSpecial = preg_match('/[^a-zA-Z\d]/', $string);

// $containsAll = $containsLetter && $containsDigit && $containsSpecial

@rybo111:不行,它们不能。 A-z 包含的字符比 a-zA-Z 还要多。 - Ry-
1
@rybo111:请停止编辑我的答案,使其变得不够清晰。没有人“请求if()”,而且你完全可以在其中使用变量。 - Ry-
如果我想要在不包含字母和数字的情况下执行某些操作,该怎么办? - Freedo
@Freedo:!$containsLetter https://www.php.net/manual/en/language.operators.logical.php - Ry-

14

您可以使用正向 预查 功能来创建单个正则表达式:

$strongPassword = preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$%^&]).*$/');
//                                              special characters  ^^^^

13

我在这里找到了一个很好的答案,解释了如何确保给定的字符串至少包含以下四种类型中的一种字符:

小写字母, 大写字母, 数字, 符号

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*(_|[^\w])).+$
一个简短的解释: ^ // 字符串起始位置 (?=.*[a-z]) // 正向前瞻,查看是否至少存在一个小写字母 (?=.*[A-Z]) // 正向前瞻,查看是否至少存在一个大写字母 (?=.*\d) // 正向前瞻,查看是否至少存在一个数字 (?=.*[_\W]) // 正向前瞻,查看是否至少存在一个下划线或非单词字符 .+ // 匹配整个字符串 $ // 字符串结束位置
希望对你有所帮助。

5

False(以上所选答案 - 谢谢!)有一个相当简单的方法可以让您更好地理解它(如果您对正则表达式不太熟悉),并帮助您找到适合自己的方法。

我只是稍微详细解释了一下:

(您可以将其粘贴到http://phptester.net/index.php?lang=en上以进行操作)

<?php

$pass="abc1A";

$ucl = preg_match('/[A-Z]/', $pass); // Uppercase Letter
$lcl = preg_match('/[a-z]/', $pass); // Lowercase Letter
$dig = preg_match('/\d/', $pass); // Numeral
$nos = preg_match('/\W/', $pass); // Non-alpha/num characters (allows underscore)

if($ucl) {
    echo "Contains upper case!<br>";
}

if($lcl) {
    echo "Contains lower case!<br>";
}

if($dig) {
    echo "Contains a numeral!<br>";
}

// I negated this if you want to dis-allow non-alphas/num:
if(!$nos) {
    echo "Contains no Symbols!<br>"; 
}

if ($ucl && $lcl && $dig && !$nos) { // Negated on $nos here as well
    echo "<br>All Four Pass!!!";
} else {
    echo "<br>Failure...";
}

?>

4

为了完成这个任务,最好使用3个不同的正则表达式,因为您需要匹配6种不同的可能性,这取决于特殊字符在字符串中的位置。但是,如果您想要使用一个正则表达式,并且您的特殊字符是“+?@”等,则有可能:

$string = "abc@123";
$regex = "/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$%^&]).*$/"
if (preg_match($regex, $string)) {
   // special characters
}

3

一个字母是\pL,一个数字是\pN,一个特殊字符是[你想要的字符],在这里我假设它不是字母也不是数字,所以正则表达式看起来像这样:

/^(?=.*?\pL)(?=.*?\pN)(?=.*[^\pL\pN])/

3
很好,你包含了非英文字符。通常被忽视。 - dval

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接