美文网首页
vee-validate 管道符和正则表达式冲突

vee-validate 管道符和正则表达式冲突

作者: jeneen1129 | 来源:发表于2023-07-18 09:45 被阅读0次

    问题描述

    我们配置一个正则,但是发现没有用,为啥呢?
    -> https://qa.1r1g.com/sf/ask/3566856681/
    v-validate指令接受一个字符串值,它是由管道 ( |)分隔的验证列表。由于管道也在正则表达式模式中使用(作为交替运算符),因此字符串命令无效。作为变通方法,传递一个对象而不是字符串值。

    问题解决

    按照上面的方法进行组织即可。

    本人这里解决的方法本质也是如此,不过由于是低代码平台的搭建,这里v-validate绑定的数据是用户通过页面(用户输入数据+前端拼接+后端配置+前端处理)配置出来的,
    还好这里有统一的组件包裹来使用 vee-validateValidationProvider组件,直接在这里搜索 regex 来重新组装成对象就可以。

    vee-validate的ValidationProvider组件的rules规则
    据观察,校验顺序在字符串时是按照前后顺序来的,在对象的时候是按照对象属性顺序来的。
    // 组件中 
    computed: {
        validateObj() {
          // fix: 正则中的 | 和 规则区分的 | 冲突问题
          if (
            typeof this.validate == 'string' &&
            this.validate.indexOf('regex') !== -1
          ) {
            let validateObj = {}
            let validate = new String(this.validate)
            const matchReg = this.validate.match(/regex:\/[^/]{0,}\//g) // 用// 来标记好正则表达式的位置
            if (matchReg && matchReg.length) {
              validate = validate.replace(matchReg[0], '')
              const validates = validate.split('|').filter(item => !!item)
              const regexIndex = this.validate.indexOf('regex')
              const regexParams = matchReg[0].substring(7, matchReg[0].length - 1)
              validates.forEach(config => {
                const valConfig = config.split(':')
                if (
                  !validateObj['regex'] &&
                  this.validate.indexOf(valConfig[0]) > regexIndex
                ) {
                  validateObj['regex'] = regexParams
                }
                if (valConfig[1] && valConfig[1].indexOf(',') !== -1) {
                  valConfig[1] = valConfig[1].split(',')
                }
                validateObj[valConfig[0]] =
                  valConfig.length > 1 ? valConfig[1] : true
              })
              if (!validateObj['regex']) {
                validateObj['regex'] = regexParams
              }
              return validateObj
            }
          }
          return this.validate
        },
      },
    
    // 拼接的时候
    // fix: 正则中的 | 和 规则区分的 | 冲突问题时,加上 '//' 包裹
          if (key == 'regex' && value.indexOf('|') != -1) {
              value =
                (value[0] !== '/' ? '/' : '') +
                value +
                (value[value.length - 1] !== '/' ? '/' : '')
              validate = key + ':' + value
            }
    
    // 后端处理
    /* 获取转义后的json字符串*/
    // 例如 =>表达式中有 \d 需要保留\ => \\d, 因为首选v-validate是使用字符串类型的校验
        public String toJsonStr(String str) throws IOException {
            if (StringUtil.isNotEmpty(str)) {
                return JSONUtil.toJson(str);
            }
            return "";
        }
    
    

    相关文章

      网友评论

          本文标题:vee-validate 管道符和正则表达式冲突

          本文链接:https://www.haomeiwen.com/subject/mymcydtx.html