[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: php - как правильно проверить строку на символы?
Strannik
Здравствуйте.

Хотелось бы проверить строку на следующих условиях: строка должна состоять только из английских букв и символов, в строке должна быть хотя бы одна заглавная буква и 1 символ.(! @ # $ % ^ & *) и 1 числа(0-9), длина строки должна быть от 8 до 20 символов.

Подскажите регулярное выражение под данные условия.
Игорь_Vasinsky
5 лет на форуме. чё случилось? не прёт php ? есть Python

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Strannik
Цитата (Игорь_Vasinsky @ 1.08.2014 - 00:25)
5 лет на форуме. чё случилось? не прёт php ? есть Python

Игорь, при чем здесь пхп или питон?
речь о регулярках, к примеру мои скромные познания стали еще скромнее когда я увидел
^(?=.*?[A-Z])(?=(.*[a-z]){1,})(?=(.*[\d]){1,})(?=(.*[\W]){8,})(?!.*\s).{20,}$


Поэтому и вопрос как все условия объединить(строчка выше не работает как нужно) ?
P.S.: разобрать строчку можно конечно, от конструкцию такую я первый раз увидел..
Placido
Цитата (Strannik @ 1.08.2014 - 09:58)
мои скромные познания стали еще скромнее когда я увидел
^(?=.*?[A-Z])(?=(.*[a-z]){1,})(?=(.*[\d]){1,})(?=(.*[\W]){8,})(?!.*\s).{20,}$

"Набор из 20 символов или больше, в которых:
- есть хотя бы одна:
  • заглавная буква латинского алфавита;
  • строчная буква латинского алфавита;
  • цифра;

- есть хотя бы восемь "небуквенноцифровых" символов (исключая знак подчеркивания),
- нет пробельных символов."
FatCat
Я бы не стал морочиться с регулярками, а разбирал бы посимвольно.
Как-то так примерно
$pwd = trim($_POST['password']);
$len = strlen($pwd);
$res = array(
"chr" => 0, // буквы
"chb" => 0, // заглавные
"num" => 0, // цифры
"sym" => 0, // !@#$%^&*
"bad" => 0 // неразрешенные
);
for($i=0;$i<$len;$i++)
{
$ord = ord($pwd{$i});
if($ord>89 and $ord<123)$res['chb']++;
elseif($ord>64 and $ord<91)$res['chr']++;
elseif($ord>47 and $ord<58)$res['num']++;
elseif( stristr("!@#$%^&*", $pwd{$i}) )$res['sym']++;
else $res['bad']++;
}
echo("<pre>");print_r($res);echo("</pre>");
Код легко читается и легко дополняется в случае надобности.

_____________
Бесплатному сыру в дырки не заглядывают...
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.