【Regular Expressions】正则校验参数必须被/{params}/包裹

70 阅读1分钟

目录

一般的校验就那么几种,但是这里需要校验条件有很多,并且还要求有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正则怎么写?

  • 正则要求

在这里插入图片描述

  • 校验

在这里插入图片描述

每条规则单独来判断是可以满足需求: 但想着如果能一次性正则来写的话那更好了

后话:其实一个循环也能搞定,正则不是万能的