在PHP中匹配正则表达式时出现警告
我需要验证符合以下条件的密码:在PHP中匹配正则表达式时出现警告,php,regex,Php,Regex,我需要验证符合以下条件的密码: 至少有一个小字母表 至少有一个大写字母 至少一位数字 这些特殊符号中至少有一个-."$& 长度为8-15个字符 为此,我在互联网上找到了一个与正则表达式有点匹配的正则表达式,并根据我的要求对其进行了修改 <?php $pwd = "Abcdef.1"; if (preg_match("^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[_.@#$&]).{8,15}$", $pwd)){ echo 'M
<?php
$pwd = "Abcdef.1";
if (preg_match("^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[_.@#$&]).{8,15}$", $pwd)){
echo 'Match Found';
}
else{
echo 'No Match Found';
}
?>
执行脚本时,PHP会抛出一条警告:
找不到匹配项php警告:preg_Match():在[my_file_path]中找不到结尾分隔符“^”
有什么帮助吗?您需要将图案括在“/”中,如下所示: 编辑: 好的,我将把这个大而混乱的正则表达式行分割成多个正则表达式模式,每个正则表达式模式对应一个约束,这将更容易阅读和理解,并且您可以向用户提供更具描述性的提示,说明当前输入的密码有什么问题(是否太短,是否缺少符号,是否缺少大写字母..你明白了..) 代码如下:
<?php
function validatePassword($pass)
{
$uppercasePattern = "/[A-Z]/";
$lowercasePattern = "/[a-z]/";
$symbolPattern = "/[\.\$@_#&]/";
$digitPattern = "/[0-9]/";
$unwantedSymbolsPattern = "/[^\w\.\$@_#&]/";
$len = strlen($pass);
if($len >=8 && $len <= 15){ // check if length is 8 - 15
$hasUppercase = false;
preg_match($uppercasePattern, $pass, $hasUppercase); // check if has uppercase letter
if(!empty($hasUppercase)){
$hasLowercase = false;
preg_match($lowercasePattern, $pass, $hasLowercase); // check if has lowercase letter
if(!empty($hasLowercase)){
$hasSymbol = false;
preg_match($symbolPattern, $pass, $hasSymbol); // check if has symbol
if(!empty($hasSymbol)){
$hasDigit = false;
preg_match($digitPattern, $pass, $hasDigit); // check if has digit
if(!empty($hasDigit)){ // check if contains needed symbol
$hasUnwantedSymbols = false;
preg_match($unwantedSymbolsPattern, $pass, $hasUnwantedSymbols);
if(empty($hasUnwantedSymbols)){ // if doesnt contain unwanted symbols return true
return true;
}else{
echo "Password contains some of the unwanted symbols!";
}
}else{
echo "Missing digit!";
}
}else{
echo "Missing on of the following symbols: . _ @ $ # &";
}
}else{
echo "Missing uppercase letter!";
}
}else{
echo "Missing uppercase letter!";
}
}
else{
echo "Password length not OK!";
}
}
$pass = "Abcdef@1as#(";
// call the function to test it out
if(validatePassword($pass)){
echo "OK";
}
?>
这对人类来说不是很容易理解。如果必须添加另一条规则会怎么样?@ConstantinGALBENU:到目前为止,我只需要这些规则。仅供参考,php需要在字符串中使用正则表达式分隔符。`“regex”。分隔符可以是除空格以外的任何字符,并且除非使用括号,否则起始和结束delim必须是相同的字符。此外,如果分隔符在正则表达式中使用,则必须对其进行转义。它现在可以工作,但它仍然接受除我所需之外的符号。就像它传递了字符串一样Abcdef@1)我通过了(这是我不想让它做的。好了,我编辑了答案,现在可以了……如果它对你有效,请标记为正确答案。干杯!谢谢。你的解决方案很长,但很有效。同时,我用正则表达式和普通PHP代码的混合缩短了它。
<?php
function validatePassword($pass)
{
$uppercasePattern = "/[A-Z]/";
$lowercasePattern = "/[a-z]/";
$symbolPattern = "/[\.\$@_#&]/";
$digitPattern = "/[0-9]/";
$unwantedSymbolsPattern = "/[^\w\.\$@_#&]/";
$len = strlen($pass);
if($len >=8 && $len <= 15){ // check if length is 8 - 15
$hasUppercase = false;
preg_match($uppercasePattern, $pass, $hasUppercase); // check if has uppercase letter
if(!empty($hasUppercase)){
$hasLowercase = false;
preg_match($lowercasePattern, $pass, $hasLowercase); // check if has lowercase letter
if(!empty($hasLowercase)){
$hasSymbol = false;
preg_match($symbolPattern, $pass, $hasSymbol); // check if has symbol
if(!empty($hasSymbol)){
$hasDigit = false;
preg_match($digitPattern, $pass, $hasDigit); // check if has digit
if(!empty($hasDigit)){ // check if contains needed symbol
$hasUnwantedSymbols = false;
preg_match($unwantedSymbolsPattern, $pass, $hasUnwantedSymbols);
if(empty($hasUnwantedSymbols)){ // if doesnt contain unwanted symbols return true
return true;
}else{
echo "Password contains some of the unwanted symbols!";
}
}else{
echo "Missing digit!";
}
}else{
echo "Missing on of the following symbols: . _ @ $ # &";
}
}else{
echo "Missing uppercase letter!";
}
}else{
echo "Missing uppercase letter!";
}
}
else{
echo "Password length not OK!";
}
}
$pass = "Abcdef@1as#(";
// call the function to test it out
if(validatePassword($pass)){
echo "OK";
}
?>