目录
一般的校验就那么几种,但是这里需要校验条件有很多,并且还要求有select下拉联动,因此记录一下
一:校验要求
<el-form-item label="路径" prop="path">
<el-input v-model="page.path" placeholder="请输入API路径" style="width:45%" class="path-info" @input="page.path = page.path.replace(/[\u4E00-\u9FA5]/g,'')">
</el-input>
<div class="path-info">
<p>1、支持以“/”、“=/”开头,以“/”开头表示模糊匹配,以“=/”开头表示精确匹配</p>
<p>2、路径中支持的字符;大小写字母、数字、和-_*./~%符号</p>
<p>3、Path类型的请求参数必须以{}包裹,作为独立部分包含在路径中(示例:/{param}/)</p>
<p>4、路径以“=/”开头时,后面不支持添加Path类型的请求参数</p>
<p>5、除“/”、“=/”开头外,路径最长字符小于或等于200</p>
</div>
</el-form-item>
二:校验rules
rules: {
path: [{required: true, trigger: 'blur', validator: this.validatePath, }],
三:自定义校验规则
validatePath(rule, value, callback) {
console.log(value, 'value');
if (value === '') {
callback(new Error('不能为空'))
}
if (value.length < 1 || value.length > 200) {
callback(new Error('长度为1-200个字符'))
}
if ((/^[(=\/)|\/]?[\da-zA-Z-_\*\.\/~%]+(\/\{[a-zA-Z\d]+\}){0,}$/.test(value)) && this.curPath === 'path'
) {
callback(new Error('Path类型的请求参数必须以/{}/包裹'))
}
if(value && this.curPath === 'path'){
const start = value.indexOf('{')
const end = value.indexOf('}')
const substr = value.substring(start+1,end)
if(!value.includes('{') || !value.includes('}')) {
callback(new Error('Path类型的请求参数必须以{}包裹'))
}
}
if (!this.specialCharacters(value)) return callback(new Error('不能含有特殊字符!!'));
callback()
},
specialCharacters(str) {
if (!str) return true;
// 大小写字母、数字、和-_*./~%符号
const specialKey = "[`!@#$^&()|': ; '\\[\\]<>?!@#¥……&()——|【】‘;:”“'。,、?‘']";
for (var i = 0; i < str.length; i++) if (specialKey.indexOf(str.substr(i, 1)) != -1) return false;
return true;
},
其他:{}内必须包含[]的js正则怎么写?
- 正则要求
- 校验
每条规则单独来判断是可以满足需求: 但想着如果能一次性正则来写的话那更好了
后话:其实一个循环也能搞定,正则不是万能的