【问题标题】:Is there validation/function to trim whitespace in sentences between words in Laravel是否有验证/功能来修剪 Laravel 中单词之间的句子中的空格
【发布时间】:2019-09-30 10:46:55
【问题描述】:

是否有验证来修剪单词之间句子中的空格?

例如,

有一个字段名,用户输入的值是这样的:

" jhon doe cool "

那么,如何修剪它,以便在存储到数据库时看起来像这样:

"jhon doe cool"

我知道trim() 功能,我尝试过thisthis, 但它只适用于开头和结尾的空格,不适用于单词之间的空格

我在控制器中使用它来验证和输入数据库

$request->validate([
    'name' => 'required|max:50',
    'srn' => 'required|size:9',
    'email' => 'required|email',
    'major' => 'required',
]);
Student::create($request->all());
return redirect('/students')->with('status', 'Data successfully added!');

【问题讨论】:

  • 你读过这个问题吗?它是关于删除 应该 删除的额外空格,除了单词之间的 1 个空格,所以是的,它是重复的
  • 删除空间和验证东西是不一样的,你能说清楚吗?
  • @CaddyDZ 我只是想问一下是否可以立即使用 Laravel 中可用的功能,而不是手动编写正则表达式,但是下面已经回答了,如果 laravel 使用正则表达式验证器,但是如果有是一种更即时的方式,它真的会帮助我

标签: php laravel validation


【解决方案1】:

Laravel 有一个正则表达式验证器。

在内部,此规则使用 PHP preg_match 函数。指定的模式应遵循 preg_match 要求的相同格式,因此还包括有效的分隔符。例如:'email' => 'regex:/^.+@.+$/i'。

注意:使用 regex / not_regex 模式时,可能需要在数组中指定规则而不是使用管道分隔符,尤其是当正则表达式包含管道字符时。

https://laravel.com/docs/6.x/validation#rule-regex

所以:

$request->validate([
    'name' => [
       'required',
       'max: 50',
       'regex:/\s+/'
    ]
]);

's' 匹配任何空格,'+' 表示无限次。

测试正则表达式的好工具:https://regex101.com/

P.s 我没有测试过,这会给你正确的输出,但应该让你走上正确的道路

【讨论】:

  • 我可以与其他验证规则一起使用吗?我已经尝试过这样但无法正常工作'name' => 'required|max:50|regex:/\s+/'
  • 仍然不工作,额外的空白仍然涉及到数据库:(
【解决方案2】:

在弄清楚并再次上网后,

我按照上面链接我mentioned的方式,但我添加了几行代码并使用preg_replacestr_replace作为修剪分隔符,

使用 PHP artisan 命令创建中间件文件来修剪请求数据,

php artisan make:middleware BeforeAutoTrimmer

并编辑函数,将array_walk_recursive放在if语句中,并在preg_replacestr_replace之后调用trim函数,模式看起来像@kyle回答

if ($input) {
    array_walk_recursive($input, function (&$item) {
        $item = trim(preg_replace('/\s\s+/', ' ', str_replace("\n", " ", $item)));
        $item = ($item == "") ? null : $item;
    });

      $request->merge($input);
 }

带有 trim 方法的类将如下所示:

<?php

namespace App\Http\Middleware;

use Closure;

class BeforeAutoTrimmer
{

    public function handle($request, Closure $next)
    {
        $input = $request->all();

        if ($input) {
            array_walk_recursive($input, function (&$item) {
                $item = trim(preg_replace('/\s\s+/', ' ', str_replace("\n", " ", $item)));
                $item = ($item == "") ? null : $item;
            });

           $request->merge($input);
        }
      return $next($request);
    }
}

它会自动删除每个输入到数据库的额外空格

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-04
    • 2017-06-20
    • 1970-01-01
    • 2014-12-21
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多