我使用的是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}
。