Вы можете окружить 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 ложным, если это так, сделайте это снова.