正则表达式验证规则,以避免特殊字符不适用于 laravel 中的文本字段

Posted

技术标签:

【中文标题】正则表达式验证规则,以避免特殊字符不适用于 laravel 中的文本字段【英文标题】:Regex validation rule to avoid special characters not applying for the text field in laravel 【发布时间】:2020-07-20 11:10:30 【问题描述】:

在我的 laravel 应用程序中,我有一个注册新域的表单。在那种形式中,我试图验证一个文本字段(subDomainName)以避免特殊字符。但除该输入字段的正则表达式外,所有其他规则都正常工作。

我的表单代码如下,

<form id="w1" action=" route('app.save') " method="post">
                        @csrf

                            <input type="text" id="app-subdomainname" class="form-control @error('subDomainName') is-invalid @enderror" name="subDomainName" placeholder=" __('sentence.Sub Domain Name') " value=" old('subDomainName') "  aria-required="true">

                            @error('subDomainName')
                                    <span class="invalid-feedback" role="alert">
                                        <strong> $message </strong>
                                    </span>
                                @enderror
                         <br>
                            <select id="app-subdomainsuffix" class="form-control @error('subDomainSuffix') is-invalid @enderror" name="subDomainSuffix" aria-required="true">
                                <option value="">-  __('sentence.Select domains')  -</option>
                                <option value="TEST.SITE">TEST.SITE</option>
                            </select>

                            @error('subDomainSuffix')
                                    <span class="invalid-feedback" role="alert">
                                        <strong> $message </strong>
                                    </span>
                                @enderror

                        <br>

                        <select id="app-packagetype" class="form-control @error('packageType') is-invalid @enderror" name="packageType" aria-required="true">
                            <option value="">-  __('sentence.Select package type')  -</option>
                            @foreach($packages as $package)
                            <option value="$package->id">$package->name</option>
                                @endforeach
                        </select>
                        @error('packageType')
                                    <span class="invalid-feedback" role="alert">
                                        <strong> $message </strong>
                                    </span>
                                @enderror
                        <br>
                            <select id="app-payment" class="form-control @error('paymentoption') is-invalid @enderror" name="paymentoption" aria-required="true">
                            <option value="">-  __('sentence.Select Payment Option')  -</option>
                            </select>
                            @error('paymentoption')
                                    <span class="invalid-feedback" role="alert">
                                        <strong> $message </strong>
                                    </span>
                                @enderror

                        <br>

                            <select id="app-themeid" class="form-control @error('themeid') is-invalid @enderror" name="themeid" aria-required="true">
                                <option value="">-  __('sentence.Select theme')  -</option>
                                <option value="default">default</option>
                            </select>
                            @error('themeid')
                                    <span class="invalid-feedback" role="alert">
                                        <strong> $message </strong>
                                    </span>
                                @enderror
                        <br>
                            <select id="app-lang" class="form-control @error('lang') is-invalid @enderror" name="lang" aria-required="true">
                                <option value="">-  __('sentence.Select Language')  -</option>
                                <option value="en">English</option>
                                <option value="fr">French</option>
                            </select>
                            @error('lang')
                                    <span class="invalid-feedback" role="alert">
                                        <strong> $message </strong>
                                    </span>
                                @enderror
                        <br>

                        <div class="form-group">
                        <input type="hidden" id="domain" class="form-control" name="domain" >
                            <button type="submit" class="btn btn-default subscribe px-5"> __('sentence.Save') </button>
                        </div>

                    </form>

而我的控制器的验证如下,

$this->validate($request, [
            'subDomainName' => 'required','regex:/(^[A-Za-z0-9 ]+$)+/',
            'subDomainSuffix' => 'required',
            'lang' => 'required',
            'themeid' => 'required',
            'paymentoption' => 'required',
            'packageType' =>'required',
            'domain' => 'unique:apps',

        ]);

除了正则表达式之外,所有验证都正常工作......

【问题讨论】:

【参考方案1】:

如果您想在单个字段上使用多个验证规则,您应该将其放在一个用管道 | 分隔的字符串中,或​​者将其放入一个数组中。试试这个:

$this->validate($request, [
            'subDomainName' => [
                'required',
                'regex:/^[A-Za-z0-9 ]+$/'
            ],
            'subDomainSuffix' => 'required',
            'lang' => 'required',
            'themeid' => 'required',
            'paymentoption' => 'required',
            'packageType' =>'required',
            'domain' => 'unique:apps',

        ]);

我还稍微缩短了您的正则表达式字符串。

【讨论】:

从 laravel 7 开始,文档建议使用数组形式的正则表达式规则,就像您在答案中所做的那样,而不是管道

以上是关于正则表达式验证规则,以避免特殊字符不适用于 laravel 中的文本字段的主要内容,如果未能解决你的问题,请参考以下文章

用于用户名验证php的正则表达式

正则表达式验证密码必须由大小写字母、数字、特殊字符组成

正则表达式,用于验证不同格式的字符串,用于特殊时间转换[重复]

javascript 正则表达式

有效的 RegEx 不适用于 ASP.Net MVC 正则表达式属性

用于用户名验证的正则表达式