Мне нужно проверить строку, длина которой равна ровно 6 ИЛИ 8. Как я могу создать правило для этой проверки?
Число должно быть 6 ИЛИ 8, оно не может быть между 6 и 8.
да, но если (strlen($abc) != 6 || strlen($abc) != 8), это не работает
Для негативов нужен &&. Иначе было бы if (strlen($abc) == 6 || strlen($abc) == 8)






Вам нужно создать собственное правило.
В приведенном ниже примере я использовал 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 (оператор ИЛИ)
Попробуйте сначала сохранить длину строки, а затем проверьте условия.
$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
не могли бы вы объяснить мне, как работают символы в этом регулярном выражении, которое вы импровизировали?
@flashstar во время написания объяснения регулярного выражения я понял, что исходное регулярное выражение намного сложнее, чем должно быть, поэтому я изменил ответ. Я включил пояснения как к оригинальному, так и к новому, более простому регулярному выражению. Но обратите внимание, что я действительно не эксперт по написанию регулярных выражений, поэтому может быть еще более простой способ сделать это.
Что вы пробовали? Использовать php.net/manual/en/function.strlen.php дважды? Использовать регулярное выражение?