Return 0 找到正则表达式匹配 (PHP)
Return 0 when regex match is found (PHP)
我希望在字符串中找到 2011-2016 时 return 0。对于我的生活,我想不出一个正则表达式,当找到匹配项时 return 0,当没有匹配项时为 1。是的,我可以轻松地否定整个声明,但我希望找到一个解决方案,以便我的代码可以保持整洁。有点强迫症?是的,希望您能提供帮助,这是 PHP 代码。很好,我还在学习。我希望更改的代码位于数组最后一个元素下的函数 passCheck 变量 $patternArray 中。这就是我目前的模式。我希望在字符串中找到 2011-2016 时 return 0。我已经研究了前瞻性的东西,也许它已经晚了,但我无法全神贯注(可能不是正确的方法)。
<?php function digitsStr($pass)
{
$nums=array();
$splt=str_split($pass);
$count=count($splt);
for($i=0;$count>$i;$i++)
{
if(preg_match("/\d/", $splt[$i])==1)
{
array_push($nums, $splt[$i]);
unset($splt[$i]);
}
}
$nums=array_merge($nums, $splt);
$str=implode($nums);
return $str;
}
?>
<?php function passCheck($string)
{
$string=digitsStr($string);
$len=strlen($string);
$msgArray=array("Must be 8-16 characters long ",
"Cannot contain a white space ",
"Does not contain at least 2 digits ",
"Must contain at least 1 uppercase ",
"Must contain at least 1 lowercase ",
"Must contain one special charcter",
"Cannot contain years 2011-2016");
$patternArray=array("/^.{8,16}$/",
"/\S{".$len."}/",
"/\d{2,}/",
"/[A-Z]/",
"/[a-z]/",
"/([!-\/]|[:-@])/",
"/201(?![1-6])/");
for($i=0;count($patternArray)>$i;$i++)
{
if(preg_match($patternArray[$i], $string)==0)
{
echo $msgArray[$i];
}
}
}
?>
<?php
$string="#M2010ATt123";
passCheck($string)
?>
首先,preg_match
return 是真还是假,它不是 return 0 或 1。因为 PHP 是每周输入的,所以这不是总是无关紧要,但它可以。最好意识到这一点。
您应该在逻辑中添加判断模式是否必须匹配的逻辑。
像这样:
$patternArray = array(
array("/^.{8,16}$/", true),
array("/\s/", false),
array("/\d.*\d/", true),
array("/[A-Z]/", true),
array("/[a-z]/", true),
array("/([!-\/]|[:-@])/", true),
array("/201[1-6]/", false)
);
for($i=0;count($patternArray)>$i;$i++) {
if(preg_match($patternArray[$i][0], $string) == $patternArray[$i][1])
另请注意,我更正了 'at least 2 numbers' 的模式。你的模式要求他们互相跟随。我更改了 'must not contain a space' 的模式。像这样你不需要额外的变量。
我希望在字符串中找到 2011-2016 时 return 0。对于我的生活,我想不出一个正则表达式,当找到匹配项时 return 0,当没有匹配项时为 1。是的,我可以轻松地否定整个声明,但我希望找到一个解决方案,以便我的代码可以保持整洁。有点强迫症?是的,希望您能提供帮助,这是 PHP 代码。很好,我还在学习。我希望更改的代码位于数组最后一个元素下的函数 passCheck 变量 $patternArray 中。这就是我目前的模式。我希望在字符串中找到 2011-2016 时 return 0。我已经研究了前瞻性的东西,也许它已经晚了,但我无法全神贯注(可能不是正确的方法)。
<?php function digitsStr($pass)
{
$nums=array();
$splt=str_split($pass);
$count=count($splt);
for($i=0;$count>$i;$i++)
{
if(preg_match("/\d/", $splt[$i])==1)
{
array_push($nums, $splt[$i]);
unset($splt[$i]);
}
}
$nums=array_merge($nums, $splt);
$str=implode($nums);
return $str;
}
?>
<?php function passCheck($string)
{
$string=digitsStr($string);
$len=strlen($string);
$msgArray=array("Must be 8-16 characters long ",
"Cannot contain a white space ",
"Does not contain at least 2 digits ",
"Must contain at least 1 uppercase ",
"Must contain at least 1 lowercase ",
"Must contain one special charcter",
"Cannot contain years 2011-2016");
$patternArray=array("/^.{8,16}$/",
"/\S{".$len."}/",
"/\d{2,}/",
"/[A-Z]/",
"/[a-z]/",
"/([!-\/]|[:-@])/",
"/201(?![1-6])/");
for($i=0;count($patternArray)>$i;$i++)
{
if(preg_match($patternArray[$i], $string)==0)
{
echo $msgArray[$i];
}
}
}
?>
<?php
$string="#M2010ATt123";
passCheck($string)
?>
首先,preg_match
return 是真还是假,它不是 return 0 或 1。因为 PHP 是每周输入的,所以这不是总是无关紧要,但它可以。最好意识到这一点。
您应该在逻辑中添加判断模式是否必须匹配的逻辑。
像这样:
$patternArray = array(
array("/^.{8,16}$/", true),
array("/\s/", false),
array("/\d.*\d/", true),
array("/[A-Z]/", true),
array("/[a-z]/", true),
array("/([!-\/]|[:-@])/", true),
array("/201[1-6]/", false)
);
for($i=0;count($patternArray)>$i;$i++) {
if(preg_match($patternArray[$i][0], $string) == $patternArray[$i][1])
另请注意,我更正了 'at least 2 numbers' 的模式。你的模式要求他们互相跟随。我更改了 'must not contain a space' 的模式。像这样你不需要额外的变量。