使用XRegExp的Yii2验证,p{L}不起作用


Yii2 validation with XRegExp, p{L} not working

我使用的是Yii2框架,我有一个Validator应该进行客户端验证。我有一个regex,它看起来像这样:为了简单起见,/^[''p{L}]+$/u,但我实际的regex有点复杂,但问题的原因是''p{L}部分。

所以我在验证器类中的代码是这样的:

public function clientValidateAttribute($model, $attribute, $view)
{
    $message = json_encode($this->message, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
    return <<<JS
    if (!XRegExp('/^[''p{L}]+$/u').test(value)) {
        messages.push($message);
    }
JS;
}

问题是,这对''p{L}来说总是失败的,但如果我为/^[A-Z]+$/之类的东西更改模式,它会完美地工作。

我使用的是1.3.0 xregexp-all.js。它被添加到''assets''AppAsset.php 中的AssetBundle类中

我在玩regex时确实注意到,当我出错并显示异常时,''p{L}被解释为p{L}。所以经过一些尝试,我发现无论出于什么原因,我都需要四个反斜杠来将其解释为'p{L}。有效的最终代码:

public function clientValidateAttribute($model, $attribute, $view)
{
    $message = json_encode($this->message, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
    return <<<JS
    if(!XRegExp('^[''''p{L}]+$').test(value)) {
        messages.push($message);
    }
JS;
}

在我的例子中,'p{L}被解释为p{L},所以我只添加了一个反斜杠来转义p,结果是''p{L}