使用模式属性

时间:2016-12-12 12:05:04

标签: regex forms validation input

首先我知道这里已经有一些关于排除邮政信箱地址的线程,但似乎他们中的大多数使用Jquery并且我试图在我的平台(prestashop)避难所中复制它们#39我为我工作了。虽然这可能是我采用的解决方案,如果所有其他方法都失败了,我希望在可能的情况下使用模式输入属性。

我希望在模式属性中使用正则表达式,但我对正则表达式不太熟悉。事实上,我最近才发现它们。

我希望根据是否输入了邮政信箱地址来验证表格。如果有,那么表格将不会提交。在做了一些研究之后,我发现了以下表达,据说这样做我正在寻找:

^ *((#\d+)|((box|bin)[-. \/\\]?\d+)|(.*p[ \.]? ?(o|0)[-. \/\\]? *-?((box|bin)|b|(#|num)?\d+))|(p(ost)? *(o(ff(ice)?)?)? *((box|bin)|b)? *\d+)|(p *-?\/?(o)? *-?box)|post office (box|bin)|((box|bin)|b) *(number|num|#)? *\d+|(num|number|#) *\d+)

这个表达对于我的理解来说太复杂了,但是在Regex101中查看它似乎与我正在寻找的相反,我可能会误解,但似乎是在验证邮政信箱并排除一切其他。无论如何,我在我的表单上尝试了它,但它似乎使它无论输入什么都不会被排除。

这让我相信我做错了或者模式输入字段不支持这样复杂的表达式,或者如果确实如此,它需要采用不同的语法。

我很欣赏对此事的一些澄清,并建议采取措施来验证我的表格。

模式输入属性是否支持这种类型的表达式,如果不是,我应该如何使用它来验证我的表单?

为了澄清这个表达式是否验证了PO框或排除它们,如果它验证了它们,我将如何更改它以执行相反的操作?

以下是我目前正在使用的代码:

<label for="return-street-address">Street Address <span class="asterisk">*</span></label> <input type="text" value="" name="ADDRESS" required id="return-street-address" "^(?! *(#\d+|(box|bin)[-. /\\]?\d+|.*p[ .]? ?[o0][-. /\\]? *-?((box|bin)|b|(#|num)?\d+)|p(ost)? *(o(ff(ice)?)?)? *((box|bin)|b)? *\d+|p *-?/?o? *-?box|post office (box|bin)|((box|bin)|b) *(number|num|#)? *\d+|(num|number|#) *\d+)).*"> 

这些:

PO Box 123
P.O. BOX 123
不应该使用此代码验证

1 个答案:

答案 0 :(得分:2)

如果你想使用你找到的模式,你需要删除字符类中不必要的转义,并用字符类替换每个字母,包括字母的小写和大写变体(这是必要的,因为一个人无法通过具有HTML5模式的正则表达式修饰符。)

使用

input:valid {
  color: black;
}
input:invalid {
  color: red;
}
<label for="return-street-address">Street Address <span class="asterisk">*</span></label> <input type="text" value="" name="ADDRESS" required id="return-street-address" pattern="^(?! *(#\d+|([bB][oO][Xx]|[Bb][Ii][Nn])[-. /\\]?\d+|.*[pP][ .]? ?[Oo0][-. /\\]? *-?(([bB][oO][Xx]|[Bb][Ii][Nn])|b|(#|[Nn][Uu][Mm])?\d+)|[Pp]([Oo][Ss][Tt])? *([Oo]([Ff]{2}([Ii][Cc][Ee])?)?)? *(([bB][oO][Xx]|[Bb][Ii][Nn])|b)? *\d+|[Pp] *-?/?[Oo]? *-?[bB][oO][Xx]|[Pp][Oo][Ss][Tt] [Oo][Ff][Ff][Ii][Cc][Ee] ([bB][oO][Xx]|[Bb][Ii][Nn])|(([bB][oO][Xx]|[Bb][Ii][Nn])|[Bb]) *([Nn][Uu][Mm][Bb][Ee][Rr]|[Nn][Uu][Mm]|#)? *\d+|([Nn][Uu][Mm][Bb][Ee][Rr]|[Nn][Uu][Mm]|#) *\d+)).*">