Убедитесь, что пароль содержит хотя бы один символ из 3 массивов - PullRequest
0 голосов
/ 31 мая 2018

Как мне убедиться, что пароль содержит хотя бы один символ из каждого массива?Я мог бы использовать do..time, верно?То, что я не совсем понимаю, - это то, что мне нужно будет вставить в выражение if внутри do ... while.

Является ли do ... в то время как единственный способ убедиться, что хотя бы один символ из каждого массива находится в конечном пароле, или есть другие способы?

 $length = 6;  
 $a1 = str_split('0123456789');  
$a2 = str_split('%^*+~?!');  
$a3 = str_split('abcdefghigklmnopqrstuvwxyz');  

$result = ""; //final random password

for($i = 0; $i < $length; $i++){

$values = [$a1,$a2,$a3];
$chosen = array_rand($values);

$result .= $values[$chosen][array_rand($values[$chosen])];
}

echo $result;

Ответы [ 3 ]

0 голосов
/ 31 мая 2018

Вы можете окружить for с ха do..while и в проверке условий с помощью preg_match () и шаблона регулярного выражения, который проверяет, есть ли хотя бы один символ в результате:

<?php

$length = 6;  
$a1 = str_split('0123456789');  
$a2 = str_split('%^*+~?!');  
$a3 = str_split('abcdefghigklmnopqrstuvwxyz');  

$result = ""; //final random password

do {
   for($i = 0; $i < $length; $i++){

        $values = [$a1,$a2,$a3];
        $chosen = array_rand($values);

        $result .= $values[$chosen][array_rand($values[$chosen])];
    } 

} while(!(preg_match('/^(?=.*?[0-9])(?=.*?[a-z])(?=.*?[%*+?!]).{1,}/', $result)));

echo $result;

Если нет совпадений с шаблоном, использующим preg_match, то вернет false, в условии do.. while мы проверяем, является ли один preg_match ложным, если это так, сделайте это снова.

0 голосов
/ 31 мая 2018
$length = 6;  
$a1 = str_split('0123456789');  
$a2 = str_split('%^*+~?!');  
$a3 = str_split('abcdefghigklmnopqrstuvwxyz');  



$resultArr[] = $a1[array_rand($a1)];
$resultArr[] = $a2[array_rand($a2)];
$resultArr[] = $a3[array_rand($a3)];

for($i = 0; $i < $length-3; $i++){

$values = [$a1,$a2,$a3];
$chosen = array_rand($values);

$resultArr[] = $values[$chosen][array_rand($values[$chosen])];
}
shuffle($resultArr);
$result = implode($resultArr); //final random password
echo $result;
0 голосов
/ 31 мая 2018

Я сделал общий ответ для любого числа массивов.

Я бы использовал для этого preg_match(), но для вопроса, который вы задали, да, вам нужно проверить каждый массив отдельно:

$user_inputted_password = $_POST['user_inputted_password'];

$length = strlen($user_inputted_password); // user input password - you are capturing this somewhere, right

$a1 = str_split('0123456789');  
$a2 = str_split('%^*+~?!');  
$a3 = str_split('abcdefghigklmnopqrstuvwxyz');  

$validate = array();

$result = ""; //final random password

function populate_validation_array($match_num, &$validate) {        
    if (!in_array($match_num, $validate)) {
        $validate[] = $match_num; 
    }
}

$numeric_indexes = array(1, 2, 3);
$index_count = count($numeric_indexes);

for($i = 0; $i < $length; $i++){        
    for($j = 0; $j < $index_count; $j++) {
        $numeric_index = $numeric_indexes[$j];
        if (in_array($user_inputted_password[$i], ${"a" . $numeric_index})) {
            populate_validation_array($numeric_index, $validate);
        }
    }
}

if (count($validate) === $index_count) {
    $values = array();
    for($i = 0; $i < $index_count; $i++) {
        $values[] = ${"a" . ($i + 1)};
    }
    $chosen = array_rand($values);
    $result .= $values[$chosen][array_rand($values[$chosen])];
}

echo $result;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...