2 Java Regex用于验证Google DFP条目

时间:2017-02-21 15:53:43

标签: java vaadin magnolia

我正在为2个输入字段寻找2个正则表达式验证。

背景

我有一个包含2个输入的表单(玉兰cms表单),用户可以为Google DFP输入广告尺寸图片尺寸。这是一个玉兰cms形式,其值在后端(Java)中得到验证。 如果条目通过验证,它将显示在前端。此处的验证可防止用户输入错误的条目格式,这可能导致Javascript错误。

我在这里尝试实现的是使用2个Regex验证来验证这些输入。一个用于广告尺寸输入字段,另一个用于图像尺寸输入字段。 用户需要手动键入所有内容,包括方括号和一些整数值(参见下面的示例)。

在这个问题中,一个条目意味着一个类似于json的2个整数数组。 例如。 [1,10],[41,123],[0,0]等。

条目的格式和样本:

广告尺寸

如果用户只想输入1 条目(参见示例1和2),那么1个2个整数的数组就足够了。但是,如果用户想要输入多于1个条目(示例3和4),则用户必须将整个条目封装在1个方括号中。

这些条目传递广告尺寸正则表达式验证:

  1. [728,90]
  2. [1,1]
  3. [[468,60],[728,90],[300,250]]
  4. [[468,60],[728,90],[300,250],[1,1]]
  5. 这些条目 NOT pass 广告尺寸正则表达式验证

    1. [212]
    2. [ABCD]
    3. [1232,23111],[2312,323]
    4. [[2211,33],[22321],[21]
    5. 123643
    6. 图片尺寸

      对于图像尺寸,它应包含2个主要条目:第一个和第二个。两个条目都以逗号分隔。

      第一个条目应该是2个整数数组。 第二个条目可以是:

      • 另一个2个整数的数组(第1个例子)
      • 2个整数数组的数组(第2个例子)
      • 一个空数组(第3和第4个例子)

      这些条目传递图像大小正则表达式验证:

      1. [990,300],[728,90]
      2. [990,300],[[728,90],[320,200],[80,31],[]]
      3. [990300],[]
      4. [1,1],[]
      5. 这些条目 NOT pass 图像大小正则表达式验证:

        1. [123,421]
        2. [123,321,531],[321,33]
        3. 13324223431
        4. [990],[728,90]
        5. [990300],[qwewqe,ggfggrg]
        6. 感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

在Magnolia中有两种方法可以做到这一点。我将通过一个例子展示两者。

首先,我们需要一个组件和一个对话框:

# component
dialog: valid:texttext
description: some yummy text you should enter
renderType: freemarker
title: Texttext
templateScript: /valid/templates/components/texttext.ftl

# dialog    
actions:
  commit:
    label: save changes
    class: info.magnolia.ui.admincentral.dialog.action.SaveDialogActionDefinition
  cancel:
    label: cancel
    class: info.magnolia.ui.admincentral.dialog.action.CancelDialogActionDefinition
form:
  tabs:
    - name: tabMain
      label: Texttext Dialog
      fields:
        - name: text1
          label: text1
          description: enter some text 1
          class: info.magnolia.ui.form.field.definition.TextFieldDefinition
          validators:
            adsizes:
              class: info.magnolia.test.field.validator.SizeFieldsValidatorDefinition
              errorMessage: Invalid ad size entered
        - name: text2
          label: text2
          description: enter some text 2
          class: info.magnolia.ui.form.field.definition.TextFieldDefinition
          validators:
            imgsizes:
              class: info.magnolia.ui.form.validator.definition.RegexpValidatorDefinition
              errorMessage: invalid image size entered
              pattern: ^\[.*$

您会注意到我添加了两个字段验证器:' adsizes'并且' imgsizes'。做这样的事情的第一种方法就是用一个很大的正则表达式作为一个'模式'属于RegexpValidatorDefinition的属性,因为我已经完成了' imgsizes'一。那个特殊的正则表达式可能是任何东西......我在那里的那个只是说我们希望这条线以一个' ['字符。在您的特定示例中,您需要一个条件正则表达式来处理这一行。一个天真的解决方案,如

^\[(\[?\d+\,\s?\d+\]?\,?\s?){1,}\]$

在列表中的广告尺寸中未通过测试#7。

根据我的观点和经验,如果我们不尝试使用regexen,那么regexen更容易调试/维护。也就是说,为什么不在五行中做五件事,而不是试图在一行中做五件事呢?这就是我的第二种方式。

您会在text1字段上注意到我附加了一个名为SizeFieldsValidatorDefinition的自定义验证程序。这是典型的木兰花纹:

package info.magnolia.test.field.validator;

import info.magnolia.ui.form.validator.definition.ConfiguredFieldValidatorDefinition;

public class SizeFieldsValidatorDefinition extends ConfiguredFieldValidatorDefinition {
    public SizeFieldsValidatorDefinition() {
        setFactoryClass(SizeFieldsValidatorFactory.class);
    }
}


package info.magnolia.test.field.validator;

import info.magnolia.context.Context;
import info.magnolia.ui.form.validator.factory.AbstractFieldValidatorFactory;

import com.vaadin.data.Item;
import com.vaadin.data.Validator;

public class SizeFieldsValidatorFactory extends AbstractFieldValidatorFactory<SizeFieldsValidatorDefinition> {
    private final Item item;
    private final Context context;

    public SizeFieldsValidatorFactory(final SizeFieldsValidatorDefinition definition, final Item item, final Context context) {
        super(definition);

        this.item = item;
        this.context = context;
    }

    public Validator createValidator() {
        return new SizeFieldsValidator(item, context, getI18nErrorMessage());
    }
}


package info.magnolia.test.field.validator;

import info.magnolia.context.Context;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang3.StringUtils;

import com.vaadin.data.Item;
import com.vaadin.data.validator.AbstractStringValidator;

public class SizeFieldsValidator extends AbstractStringValidator {

    private final Item item;
    private final Context context;

    public SizeFieldsValidator(final Item item, final Context context, final String errorMessage) {
        super(errorMessage);

        this.item = item;
        this.context = context;
    }

    @Override
    protected boolean isValidValue(String text1) {
        if (!StringUtils.isEmpty(text1)) {
            return checkit(text1);
        }

        return false;
    }

    private boolean checkit(String text1) {
        // the atomic pattern '[number,number]':
        Pattern atom = Pattern.compile("\\[\\d+\\s?\\,\\s?\\d+\\]");

        // must start with '[' and end with ']' in all cases:
        Pattern pattern = Pattern.compile("^\\[(.*)\\]$");
        Matcher matcher = pattern.matcher(text1);
        if (!matcher.matches()) {
            return false;
        }

        // the bit inside the required outer '[' and ']':
        String data = matcher.group(1);

        // now check that the bits inside follow the plan:
        if (!Pattern.matches("\\d+\\s?\\,\\s?\\d+", data) && !Pattern.matches("(" + atom + "\\s?\\,?\\s?){1,}", data)) {
            // ^ bare numbers                                // ^ multiple objs
            return false;
        }

        return true;
    }
}

正如您所看到的,这是我的首选解决方案,实际上将问题分解为几个步骤:首先,我们确保用户输入的内容始于&#39; [&#39;并以&#39;]&#39;结束,然后我们确保其他内容是一个简单的元组,或这些元组的集合。再一次,有更好看的方法来编写这些regexen,并且有更简洁的方法来编写它们。但这种方式可维护。并且,它通过了您为广告尺寸提出的所有测试。

我已将图片尺寸作为练习,因为它与广告尺寸非常相似。

我希望这会有所帮助。