vee-validate 正则表达式不工作
vee-validate regex not working
我需要使用 vee-validate 验证美国 phone 号码 XXX-XXX-XXXX basic regex: (?:\d{3}-)\d{3}-\d{4}
. The regex works fine by itself,但不适用于 vee-validate,我不确定为什么。
标记
<!DOCTYPE html>
<html>
<head>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vee-validate@latest/dist/vee-validate.js"></script>
</head>
<body>
<div id="app">
<form action='#' method='POST'>
<input v-validate="'required|regex:^(?:\(\d{3}\)|\d{3}-)\d{3}-\d{4}$'" :class="{'input': true, 'is-danger': errors.has('phone_primary') }" class="input is-info" type="text" name='phone_primary' value="$phone_primary" placeholder="404-555-1212" size="15">
<span v-show="errors.has('phone_primary')" class="help is-danger">{{ errors.first('phone_primary') }}</span>
<button class="button is-link" name='submitform' value='go'>Submit</button>
</form>
</div>
<script>
Vue.use(VeeValidate);
new Vue({
el: '#app',
template: '#app',
data: {
phone_primary: null
}
});
</script>
</body>
</html>
我做错了什么正则表达式没有按预期工作?
v-validate
指令接受一个字符串值,它是由竖线分隔的验证列表 (|
)。由于管道也在正则表达式模式中使用(作为交替运算符),因此字符串命令无效。作为解决方法,传递对象而不是字符串值。
此外,vee-validate
中的正则表达式需要 正则表达式分隔符 ,/
个字符围绕模式。
所以,您可以使用
v-validate="{ required: true, regex:/^(?:\(\d{3}\)|\d{3}-)\d{3}-\d{4}$/ }"
注意正则表达式不匹配空字符串,因此空输入无效。
此外,如果您在某些不允许传递对象的组件中使用它,请使用自定义规则:
Vue.use(VeeValidate);
new Vue({
el: '#app',
created() {
this.$validator.extend('phone_pattern', {
getMessage(field, val) {
return 'The ' + field + ' field should match the "(XXX)XXX-XXX-XXXX" or "123-XXX-XXXX" pattern!'
},
validate(value, field) {
return /^(?:\(\d{3}\)|\d{3}-)\d{3}-\d{4}$/.test(value);
}
})
},
methods: {
validate() {
this.$validator.validateAll()
.then((result) => {
if (result) {
alert('valid!');
}
});
}
}
});
.text-danger {
color: red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vee-validate/2.0.9/vee-validate.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
<form action="" @submit.prevent="validate">
<div class="form-group">
<label for="">Phone number:</label>
<input name="phone" type="text" class="form-control" v-validate="'required|phone_pattern'" />
<span class="text-danger">{{ errors.first('phone') }}</span>
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
</div>
我在使用内置的 v-validate 规则处理复杂的正则表达式时遇到了问题。我有一个正则表达式,用于检查密码字段是否包含字母和数字。
正则表达式是:/^(?=.[0-9])(?=.[a-zA-Z])([a-zA-Z0-9] +)$/克
我花了很长时间尝试使用内置的 regex: 参数来实现它,但没有成功,所以最后我编写了自己的扩展程序。所以在我的挂载中:
this.$validator.extend('complex_password', {
validate(value, args) {
return Util.isComplexPassword(value);
}
})
然后在我的实用程序库中添加了一个函数:
isComplexPassword(value) {
tester = /^(?=.*[0-9])(?=.*[a-zA-Z])([a-zA-Z0-9]+)$/g
isMatch = !tester.test(String(value))
return !isMatch
},
最后,将其连接到我的字段验证中:
v-验证=“'required|min:8|complex_password'”
我需要使用 vee-validate 验证美国 phone 号码 XXX-XXX-XXXX basic regex: (?:\d{3}-)\d{3}-\d{4}
. The regex works fine by itself,但不适用于 vee-validate,我不确定为什么。
标记
<!DOCTYPE html>
<html>
<head>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vee-validate@latest/dist/vee-validate.js"></script>
</head>
<body>
<div id="app">
<form action='#' method='POST'>
<input v-validate="'required|regex:^(?:\(\d{3}\)|\d{3}-)\d{3}-\d{4}$'" :class="{'input': true, 'is-danger': errors.has('phone_primary') }" class="input is-info" type="text" name='phone_primary' value="$phone_primary" placeholder="404-555-1212" size="15">
<span v-show="errors.has('phone_primary')" class="help is-danger">{{ errors.first('phone_primary') }}</span>
<button class="button is-link" name='submitform' value='go'>Submit</button>
</form>
</div>
<script>
Vue.use(VeeValidate);
new Vue({
el: '#app',
template: '#app',
data: {
phone_primary: null
}
});
</script>
</body>
</html>
我做错了什么正则表达式没有按预期工作?
v-validate
指令接受一个字符串值,它是由竖线分隔的验证列表 (|
)。由于管道也在正则表达式模式中使用(作为交替运算符),因此字符串命令无效。作为解决方法,传递对象而不是字符串值。
此外,vee-validate
中的正则表达式需要 正则表达式分隔符 ,/
个字符围绕模式。
所以,您可以使用
v-validate="{ required: true, regex:/^(?:\(\d{3}\)|\d{3}-)\d{3}-\d{4}$/ }"
注意正则表达式不匹配空字符串,因此空输入无效。
此外,如果您在某些不允许传递对象的组件中使用它,请使用自定义规则:
Vue.use(VeeValidate);
new Vue({
el: '#app',
created() {
this.$validator.extend('phone_pattern', {
getMessage(field, val) {
return 'The ' + field + ' field should match the "(XXX)XXX-XXX-XXXX" or "123-XXX-XXXX" pattern!'
},
validate(value, field) {
return /^(?:\(\d{3}\)|\d{3}-)\d{3}-\d{4}$/.test(value);
}
})
},
methods: {
validate() {
this.$validator.validateAll()
.then((result) => {
if (result) {
alert('valid!');
}
});
}
}
});
.text-danger {
color: red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vee-validate/2.0.9/vee-validate.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
<form action="" @submit.prevent="validate">
<div class="form-group">
<label for="">Phone number:</label>
<input name="phone" type="text" class="form-control" v-validate="'required|phone_pattern'" />
<span class="text-danger">{{ errors.first('phone') }}</span>
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
</div>
我在使用内置的 v-validate 规则处理复杂的正则表达式时遇到了问题。我有一个正则表达式,用于检查密码字段是否包含字母和数字。 正则表达式是:/^(?=.[0-9])(?=.[a-zA-Z])([a-zA-Z0-9] +)$/克
我花了很长时间尝试使用内置的 regex: 参数来实现它,但没有成功,所以最后我编写了自己的扩展程序。所以在我的挂载中:
this.$validator.extend('complex_password', {
validate(value, args) {
return Util.isComplexPassword(value);
}
})
然后在我的实用程序库中添加了一个函数:
isComplexPassword(value) {
tester = /^(?=.*[0-9])(?=.*[a-zA-Z])([a-zA-Z0-9]+)$/g
isMatch = !tester.test(String(value))
return !isMatch
},
最后,将其连接到我的字段验证中:
v-验证=“'required|min:8|complex_password'”