2013-11-30 2 views
0

Мне нужно проверить, содержат ли пароли только цифры и буквы в алфавитном порядке. Я использую следующее регулярное выражение:Регулярное выражение не проверяет корректность паролей

if (!preg_match("^[A-Za-z0-9 _]*$^", $_POST['password'])) 
{ 
// show error 
} 
{ 

но это не сработает и позволяет другим символам языков не останавливать подачу. в чем проблема?

+0

use '! Preg_match ('^ [a-zA-Z0-9 _] + $')' и не забудьте использовать 'else' –

ответ

2

Удалить ^ в конце preg_match. ^ означает (если найден как первый символ), начинающийся, если он является концом, он имеет значение, которое должно присутствовать в символе ^, но поскольку перед ним появляется $, его смысл путается и может означать несколько вещей, возможно "один после окончания персонаж ^.

Используйте regexpal.com чтобы проверить ваше регулярное выражение.

На самом деле я хотел бы изменить его к этому:

if (preg_match("[^A-Za-z0-9 _]", $_POST['password'])) 
{ 
    // invalid character 
} 
+0

Это быстро, но также разрешает пустые пароли, поэтому вы, вероятно, также нужно проверить длину до этого. – Archimedix

+0

Также нет разделителей – Archimedix

0

Попробуйте

preg_match('/^[\w]+$/', $_POST['password']) instead ! 

Альтернатива:

preg_match("/^[a-zA-Z0-9]+$/", $_POST['password']) 
+1

Отсутствует + на первом регулярном выражении! ;) –

+0

Спасибо за напоминание !! :) –

2

Там нет такого понятия, как число "АНГЛИЙСКИЙ" или письмом. Многие языки (или могут быть) записаны с использованием того же алфавита, что и английский. Его обычно называют латинским алфавитом.

Если вы действительно хотите принимать только латинские буквы и цифры, использование:

if preg_match("/^[a-zA-Z0-9]+$/", $_POST['password']) { 
    //good to go 
} else { 
    //I don't like this password 
} 

Ваш оригинальный регулярное выражение имеет дополнительный задний ^, и это позволяет пробелы и подчеркивания. Вы хотите, чтобы эти персонажи были допущены? Если это так, используйте ^[\w ]+$.

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

Если вы проверяете наличие слабых паролей, пожалуйста, не обращайте внимания. Однако есть и другие факторы, которые вы должны учитывать как длину и наличие словарных слов. См. this answer для некоторых отличных деталей.

Относительно примечания, вы храните пароли своих пользователей в хешированной форме? Это абсолютная необходимость.

0

preg_match() и т.п. использовать разделитель в первом символе. Это закончит регулярное выражение, после чего строка должна закончиться или указать только модификаторы.

Таким образом, ваш код должен быть указан, например.

if (!preg_match('`^[A-Za-z0-9 _]+$`', $_POST['password'])) 
{ 
// show error 
} 
{ 

Вы использовали ^ в качестве разделителя, но должны использовать его, чтобы вызвать ваше регулярное выражение для поиска с начала строки, поэтому я использую `обратные одиночные кавычки, как это редко используется в строке (другие будут использовать /).

Кроме того, используйте одинарные кавычки, потому что двойные кавычки " позволяют ссылаться на долларовые ссылки, но вы хотите, чтобы $ обозначил конец пароля для соответствия. более

одно: Соответствие [...]* также позволит пустые пароли, которые вы не должны поощрять, поэтому + (хотя это спорно, если вы предпочли бы иметь пароли, по крайней мере, п символов, т.е. совпадающих с помощью [...]{n,}).

Смежные вопросы