首页 > 解决方案 > 工作正则表达式在 laravel 验证中不起作用

问题描述

我在社交网站中有用于验证用户个人资料 url 的自定义正则表达式:

/(?:https:\/\/)?(?:http:\/\/)?(?:www\.)?(?:ok|odnoklassniki)\.ru\/(?:\w*#!\/)?([\w-]*)/

在此处查看演示。

代码:

if(isset($request->odnoklassniki)) {
    $this->validate($request, [
        'odnoklassniki' => 'regex:/(?:https:\/\/)?(?:http:\/\/)?(?:www\.)?(?:ok|odnoklassniki)\.ru\/(?:\w*#!\/)?([\w-]*)?/'
    ], ['regex' => 'Enter correct url to your profile in this website']);
    $candidate->odnoklassniki = $request->odnoklassniki;
    $candidate->save(); 
}

错误信息:

preg_match(): 没有找到结束分隔符 '/'

正则表达式在我的php 代码中成功运行:

$re = '/(?:https:\/\/)?(?:http:\/\/)?(?:www\.)?(?:ok|odnoklassniki)\.ru\/(?:\w*#!\/)?([\w-]*)/m';
$str = 'https://www.odnoklassniki.ru/username

http://odnoklassniki.ru/username

ok.ru/username
';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
echo "<pre>";
    print_r($matches);
echo "</pre>";

结果:

Array
(
    [0] => Array
        (
            [0] => https://www.odnoklassniki.ru/username
            [1] => username
        )

    [1] => Array
        (
            [0] => http://odnoklassniki.ru/username
            [1] => username
        )

    [2] => Array
        (
            [0] => ok.ru/username
            [1] => username
        )

)

标签: regexlaravelvalidation

解决方案


管道字符“ | ”在验证中具有特殊功能,它分隔您的验证规则,例如:

$validatedData = $request->validate([
    'title' => 'required|unique:posts|max:255'
]);

但由于您的正则表达式验证包括管道字符,您可以使用声明验证规则的其他方法

$validatedData = $request->validate([
    'title' => [
        'required',
        'unique:posts',
        'max:255'
    ]
]);

所以这是您问题的解决方案:

if(isset($request->odnoklassniki)) {
    $this->validate($request, [
        'odnoklassniki' => [
            'regex:/(?:https:\/\/)?(?:http:\/\/)?(?:www\.)?(?:ok|odnoklassniki)\.ru\/(?:\w*#!\/)?([\w-]*)?/'
        ]
    ], ['regex' => 'Enter correct url to your profile in this website']);
    $candidate->odnoklassniki = $request->odnoklassniki;
    $candidate->save(); 
}

推荐阅读