Пробелы, не пойманные проверкой Laravel

Я пытаюсь проверить поле ввода пароля, и валидатор не улавливает пробелы. Поле пароля должно быть не менее 6 символов, а регулярное выражение должно допускать пробелы в пароле, но не в начале или в конце (я подтвердил, что это работает вне валидатора).

Когда пользователь вводит 1+ пробелов в поле пароля (но не другие символы) и отправляет, валидатор не может его перехватить (т. е. " " не перехватывается валидатором).

Вот как выглядит мой валидатор:

$this->validate($request, [
    'name' => 'required|max:255|alpha',
    'password' => 'regex:/^[^\s]+(\s+[^\s]+)*$/|min:6|confirmed',
]);

person DanielRH    schedule 31.08.2016    source источник


Ответы (3)


Валидатор проверяет, соответствует ли ввод Validatable() путем обрезки ввода, и определение того, являются ли входные данные пустыми, и, несмотря на их пустоту, должны ли эти входные данные по-прежнему проверяться (т. е. входные данные с такими правилами, как обязательный, присутствующий и т. д., определяются как подлежащие проверке и обрабатываются позже в процессе проверки).

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

HT к jemaclus за то, что он покопался и обнаружил это.

person DanielRH    schedule 31.08.2016

У вас ошибка в регулярном выражении. После второго символа \s должно идти *, а не +. Используйте следующий:

/^[^\s]+(\s*[^\s]+)*$/

Валидатор может не работать, если другие правила используются вместе с регулярным выражением и разделены конвейерами. Поэтому попробуйте использовать массив правил:

'password' => array('regex:/^[^\s]+(\s*[^\s]+)*$/', 'min:6', 'confirmed')

person Andrej Ludinovskov    schedule 31.08.2016
comment
Спасибо за помощь Андрей. Я не мастер регулярных выражений (просто взял регулярное выражение, которое я использовал из другого вопроса), однако и ваше, и мое, похоже, делают одно и то же (в любом случае валидатор все еще не улавливает пробелы и выдает ошибку). - person DanielRH; 31.08.2016
comment
@DanielRHarris, какая строка не проходит проверку? - person Andrej Ludinovskov; 31.08.2016
comment
Проблема в том, что он проходит проверку: (т.е. все пробелы) - person DanielRH; 31.08.2016
comment
Без изменений, по-прежнему разрешены все пробелы. - person DanielRH; 01.09.2016
comment
Можете ли вы опубликовать все действия с контроллера? @DanielRHarris - person Andrej Ludinovskov; 01.09.2016

я тестировал это в тестовом приложении laravel, и, похоже, это сработало

'password' => 'required|min:6|confirmed|regex:/^[^\s]+(\s+[^\s]+)*$/',

person Stephen Hendricks    schedule 31.08.2016
comment
Если вы добавите требуемый, он работает (потому что валидатор, кажется, обрезает ввод, а затем требуемый терпит неудачу, потому что он пуст), но это для поля обновления пароля на странице редактирования профиля, если они оставят его пустым, я хочу, чтобы он просто не обновляйте их пароль. HT jemaclus - кажется, что валидатор просто игнорирует все строки пробелов... так что он даже не достигает регулярного выражения или min. - person DanielRH; 01.09.2016