@sprashivatel

Как проверить такое совпадение регуляркой?

$this->login = filter_input(INPUT_POST, 'login', FILTER_VALIDATE_REGEXP, [
    'options' => [
        'regexp' => '#^[a-z]{3,15}(?:\s[a-z]{3,15})*$|^[а-яё]{3,15}(?:\s[а-яё]{3,15})*$#ui'
    ]
]);
$this->password = filter_input(INPUT_POST, 'password', FILTER_VALIDATE_REGEXP, [
    'options' => [
        'regexp' => '#^[\S]*$#'
    ]
]);

if (!$this->login) { // если логин не 3-15 или Ru или En букв с может одним пробелом между ними, то
    echo 'Вы не ввели или неправильно ввели логин';
}
if (!$this->password) { // если в пароле есть пробелы, то
    echo 'Вы не ввели или неправильно ввели пароль';
}


Можно ли именно регуляркой свериться с $this->login, чтобы получить следующее
if (!$this->password) { // если в пароле есть пробелы И/ИЛИ пароль совпадает с логином, то
    echo 'Вы не ввели или неправильно ввели пароль';
}
  • Вопрос задан
  • 83 просмотра
Решения вопроса 2
PageAuditRU
@PageAuditRU
Senior SEO Анализатор
Если именно регуляркой, то вот так. Пишу по памяти, могу опечататься.

if (!$this->password || preg_match( '/' . preg_qoute( $this->password, '/' ) . '/u', $this->login ) == 1) { // если в пароле есть пробелы И/ИЛИ пароль совпадает с логином, то
echo 'Вы не ввели или неправильно ввели пароль';
}
Ответ написан
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
Можно:
if (!$this->password OR $this->login === $this->password) { // если в пароле есть пробелы ИЛИ пароль совпадает с логином, то
    echo 'Вы не ввели или неправильно ввели пароль';
}


Кстати, с приведённым вами RegExp-ом для логина возможен такой вполне валидный логин 'aaaaa bbbbb ccccc ddddd eeeee'. И с помощью RegExp это не ограничишь. Поэтому стоит сделать так:
if (!$this->login OR mb_strlen($this->login) > 15) { // если логин не 3-15 или Ru или En букв с может одним пробелом между ними, то
    echo 'Вы не ввели или неправильно ввели логин';
}


А если хотите вариант максимум с одним пробелом 'aaaaa bbbbb', то:
$this->login = filter_input(INPUT_POST, 'login', FILTER_VALIDATE_REGEXP, [
    'options' => [
        'regexp' => '#^[a-z]{3,15}(?: [a-z]{3,15})?$|^[а-яё]{3,15}(?: [а-яё]{3,15})?$#usi'
    ]
]);

Но и в этом случае нужна проверка mb_strlen($this->login) > 15, что бы не пропустить логин длиной (15+пробел+15) в 31 символ.

P.S. Кстати в RegExp сочетание '\s' означает 'любой символ из списка: пробел ( ), табуляция (\t), возврат каретки (\r), перенос строки (\n)'. А в случае UTF-8 - вообще набор из 25 символов! Поэтому стоит заменить '\s' на обычный пробел ' ', что я и сделал.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы