Я надеюсь вернуть 0, когда 2011-2016 найдены в строке. На протяжении жизни я не могу найти регулярное выражение, которое будет возвращать 0, когда совпадение найдено, и 1, если совпадения нет. Да, я мог бы легко отрицать все утверждение, но я надеялся найти решение, чтобы мой код оставался аккуратным. Слегка ОКР? да, надеюсь, вы можете помочь, вот код PHP. Будь мил, я все еще учусь. Код, который я надеюсь изменить, находится в переменной passCheck функции $ patternArray под последним элементом массива. Это образец, который я имею в настоящее время. Я надеюсь вернуть 0, когда 2011-2016 найдены в строке. Я посмотрел в будущее и, может быть, уже поздно, но не могу обернуть голову (может быть, это не правильный подход).
<?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
возвращает true или false, он не возвращает 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])
Также обратите внимание, что я исправил шаблон как минимум 2 числа. Ваш образец требовал, чтобы они следовали друг за другом. Я изменил шаблон для «не должен содержать пробел». Таким образом, вам не нужна дополнительная переменная.
Других решений пока нет …