Проверка правила для длины строки в Laravel

Мне нужно проверить строку, длина которой равна ровно 6 ИЛИ 8. Как я могу создать правило для этой проверки?

Число должно быть 6 ИЛИ 8, оно не может быть между 6 и 8.

Что вы пробовали? Использовать php.net/manual/en/function.strlen.php дважды? Использовать регулярное выражение?

user3783243 27.10.2022 21:50

да, но если (strlen($abc) != 6 || strlen($abc) != 8), это не работает

flash star 27.10.2022 22:00

Для негативов нужен &&. Иначе было бы if (strlen($abc) == 6 || strlen($abc) == 8)

aynber 27.10.2022 22:11
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
3
109
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вам нужно создать собственное правило.

В приведенном ниже примере я использовал Closure для создания пользовательского правила, но вы можете создать объект правила, чтобы использовать его повторно.

Я использовал mb_strlen вместо strlen, чтобы покрыть многобайтность. (символы UTF8)

use Illuminate\Support\Facades\Validator;
use \Illuminate\Http\Request;

Route::get('/test', function (Request $request) {
    $validator = Validator::make($request->all(), [
        'title' => [
            'required',
            function ($attribute, $value, $fail) {
                if (!(mb_strlen($value) == 8 || mb_strlen($value) == 6))
                {
                    $fail('The ' . $attribute . ' is invalid.');
                }
            },
        ],
    ]);

    dd($validator->errors());
});

Используйте || вместо вложенного if (оператор ИЛИ)

Sumit kumar 27.10.2022 22:14

Попробуйте сначала сохранить длину строки, а затем проверьте условия.

$str = “hellowld”;
$len = strlen($str);
If($len == 6 || $len == 8)
    //do something 
Else
    //throw error

или используйте правило проверки регулярного выражения для длины как:

 /^[68]+$/

Для длины строки.

Ответ принят как подходящий

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

[
    ...
    'parameter' => 'regex:/^(.{6}|.{8})$/g',
    ...
]

Регулярное выражение украдено и адаптировано из здесь , но вы можете протестировать его здесь

Объяснение регулярного выражения:

^    # Start of string
(    # Start capture group
.    # Matches any character except line breaks
{6}  # Quantifier that only matches 6 preceding tokens (.)
|    # OR operator
.    # Matches any character except line breaks
{8}  # Quantifier that only matches 8 preceding tokens (.)
)    # End capture group
$    # End of string

СТАРЫЙ ОТВЕТ (излишне сложный)

[
    ...
    'parameter' => 'regex:/^(?=.*$)(?:.{6}|.{8})$/g',
    ...
]

Объяснение регулярного выражения:

^    # Start of string
(?=  # Start of positive lookahead
.*   # Matches any character except line breaks 0 or more times
$    # End of string
)    # End of positive lookahead
(?:  # Start of non-capturing group
.{6} # Matches any character except line breaks exactly 6 times
|    # OR operator
.{8} # Matches any character except line breaks exactly 8 times
)    # End non-capturing group
$    # End of string

не могли бы вы объяснить мне, как работают символы в этом регулярном выражении, которое вы импровизировали?

flash star 28.10.2022 17:20

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

fvfvfvfv 28.10.2022 20:56

Другие вопросы по теме