求助:如何用正则表达式验证字符串首尾空格?现有规则失效
解决Laravel中验证字符串首尾无空格的问题
你的正则表达式逻辑完全错误,当前的/^\s+|[a-zA-Z\t\h]+|(^$)+|\s+$/用了多个|(或)条件,意味着只要字符串匹配任意一项就会通过验证——比如开头带空格的字符串会匹配^\s+,反而会被判定为有效,这和你的需求完全相反。
正确的验证方案
你需要确保字符串首尾都不包含空白字符(空格、制表符等),中间可包含合法字符(包括中间空格),以下是两种可行方案:
1. 精准正则验证
替换原正则规则为:
'regex:/^[^\s].*[^\s]$|^[^\s]$/'
这个正则的逻辑:
^[^\s].*[^\s]$:匹配首尾非空白、中间可任意内容的字符串(长度≥2)|^[^\s]$:匹配单个非空白字符的字符串(长度=1)
如果marca字段仅允许字母(大小写)和中间空格,可细化正则为:
'regex:/^[a-zA-Z](?:[a-zA-Z\s]*[a-zA-Z])?$/'
2. 自动修剪后验证(可选)
若你希望自动去除首尾空格再验证(而非直接阻止提交),可添加trim规则(但会修改用户输入,严格阻止场景不推荐):
'marca' => ['required', 'trim', 'regex:/^[a-zA-Z\s]+$/'],
修改后的完整代码
try { DB::beginTransaction(); $validatedData = $request->validateWithBag('marcas', [ 'marca' => ['required', 'regex:/^[^\s].*[^\s]$|^[^\s]$/'], 'descripcion' => ['required'], ]); $show = Marca::create($validatedData); DB::commit(); $success = toast('Marca agregada con exito!', 'success', 'top-right'); } catch (\Exception $e) { DB::rollBack(); toast('Datos requeridos o invalidos!','error','top-right'); } return redirect()->route('marcas.index', with('success'));
内容的提问来源于stack exchange,提问作者UndecoDE
相关产品推荐
相关产品推荐

