如何检查字符串中是否至少有一个字母,数字和特殊字符

时间:2012-03-06 16:35:56

标签: php regex string special-characters

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

我想知道REGEX会确保字符串有一个字母(上部或下部),一个数字和一个特殊字符?

这是我目前所知的(并不多):

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

帮助会很棒!

谢谢!

6 个答案:

答案 0 :(得分:47)

最简单(也可能是最好)的方式是使用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

答案 1 :(得分:11)

您可以使用正面lookahead创建单个正则表达式:

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

答案 2 :(得分:7)

我在这里找到了很好的解释,并确保给定字符串包含以下每个类别中至少一个字符。

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

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*(_|[^\w])).+$

一个简短的解释:

^ //字符串的开头

(?=.*[a-z]) //使用正面预测来查看是否存在至少一个小写字母

(?=.*[A-Z]) //使用正面预测来查看是否存在至少一个大写字母

(?=.*\d) //使用正面向前看,看看是否存在至少一个数字

(?=.*[_\W]) //使用正面预测来查看是否存在至少一个下划线或非单词字符

.+ //吞噬整个字符串

$ //字符串的结尾

希望能帮助你。

答案 3 :(得分:4)

最好使用3个不同的正则表达式来完成此操作,因为您需要匹配6种不同的可能性,具体取决于字符串中特殊字符的位置。但是如果你想在一个正则表达式中执行它,并且你的特殊字符是[+?@],则有可能:

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

答案 4 :(得分:3)

一封信是\pL,一个数字是\pN,一个特殊的字符是[what you want],这里我假设它不是一个字母而不是一个数字,所以正则表达式看起来像:

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

答案 5 :(得分:2)

错误(选择上面的答案 - 谢谢!)有一个非常简单的方法来包围它(如果你不熟悉正则表达式)并想出适合你的东西。

我只想详细说明一下:

(您可以将其粘贴到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...";
}

?>