我有一个要求,其中接受字符串的输入字段只能具有这些格式中的一种,使用 javascript 或 jsf 验证器实现此功能的最佳方法是什么:
N/ANNN 或 N/ANNNN
上面的模式中可以有任何字母代替 A。上面的模式中可以有任何数字代替 N,而不是 0。
我有一个要求,其中接受字符串的输入字段只能具有这些格式中的一种,使用 javascript 或 jsf 验证器实现此功能的最佳方法是什么:
N/ANNN 或 N/ANNNN
上面的模式中可以有任何字母代替 A。上面的模式中可以有任何数字代替 N,而不是 0。
首先,没有“最好”的方式。只有“正确”的方式取决于具体的功能要求。
在 JSF 中进行验证的常规方法是使用通过tags可用的标准验证器之一<f:validateXxx>
,或者如果所需的功能在标准标记中不可用,则创建一个实现 Validator 接口的类。另一种方法是按照您自己的建议通过 JavaScript 进行验证,但这完全破坏了服务器端验证的稳健性,因为 JavaScript 代码由最终用户完全控制,因此最终用户可以编辑/欺骗/禁用。
在您的特定情况下,您想要验证输入是否与常规模式匹配。在这种情况下,这<f:validateRegex>
就是作业的正确标签。
至于实际的正则模式,1 到 9 之间的任何数字都用 regex 表示,[1-9]
而 A 和 Z 之间的任何字母字符都用 regex 表示[A-Z]
(区分大小写!如果您也打算允许小写,请使用[a-zA-Z]
)。像最后一个数字一样的任何“零次或一次出现”都在正则表达式中,(...)?
由此...
将替换为实际模式。其余的字符/
和-
可以按原样表示,只要它们不是正则表达式中的特殊字符,例如.
,(
等,否则需要用 . 转义\
。
所以,总而言之,这应该做:
<h:inputText>
<f:validateRegex pattern="[1-9]/[A-Z]-[1-9]-[1-9]-[1-9](-[1-9])?" />
</h:inputText>
如果您允许输入大写或小写字符,请使用以下表达式。
<h:inputText>
<f:validateRegex pattern="[1-9]/[a-zA-Z](-[1-9]){3,4}" />
</h:inputText>
<h:inputText>
<f:validateRegex pattern="((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{6,20})" />
</h:inputText>
从此模式中,只有在 6 到 20 范围内且至少有一个数字、一个大写字母、一个小写字母和一个特殊符号(“@#$%”)时才被接受