我正在处理一些不同的表单验证类型,我无法将我愿望清单上的所有项目都用到。
我的cfinput代码是这样的(与常规表单输入相同,并且有一些罐装javascript验证)
<cfinput type="Text" name="negdays"
range="0,23"
pattern="^(([^0]{1})([0-9])*|(0{1}))?$"
message="Negative Days must be a number between 0 and 23"
required="No" width="2" >
除了$
之外,这个应该并且确实排除了我需要的一切。我无法阻止表单接受$
。
另一个类似的例子就是这个我想要一个范围并保持数字的例子,所以我混合了验证类型
<cfinput type="text" name="achamount"
validate = "range,numeric"
range = "0,99999"
message="ACH Amount must be a range from 0 - 99999 and numeric only" >
......并且它完美无缺 - 除了一个问题:允许$
。
所以我想也许我可以添加这样的正则表达式:
<cfinput type="text" name="achamount"
validate = "range,numeric,regex"
range = "0,99999"
pattern="^\d"
message="ACH Amount must be a range from 0 - 99999 and numeric only" >
但我的模式当然只是将它限制为数字,我已经在做了。我需要我的模式来排除美元符号。但作为一个特殊角色,它的行为与我想摆脱的其他东西不同。
有任何想法或建议吗?我尝试的所有内容都无效或打破了页面上的所有其他验证。
答案 0 :(得分:2)
您无需专门排除$
- 只允许使用数字,您只需确保每个字符都匹配\d
。
要执行此操作,您需要将正则表达式的开头和结尾锚定到输入的开头和结尾,分别使用正则表达式元字符^
和$
完成。 (如果您需要将这些字符中的任何一个用作文字,请在前面添加反斜杠。)
因此,对于0到99999之间的整数,您需要:
^\d{1,5}$
匹配0到23之间的整数的方式相同,但模式的中心部分需要复杂,以确保您不会达到24或更高:
^(?:[03-9]|1\d?|2[0-3]?)$
这里的三个选择是:
* [03-9]
匹配除1或2之外的任何单个数字。
* 1\d?
匹配1,或1后跟任何数字。
* 2[0-3]?
匹配2或2,后跟任何数字,最多3个。
(?:
.. )
是为了确保^
和$
仍适用于整个字符串。
(当然,您也可以使用^\d{1,2}$
然后检查它是否小于24。)
如上所述,在这种情况下你不需要这样做,但是如果你遇到需要排除$
的情况,你可以使用负字符类来执行此操作:
^[^$]{1,5}$
或使用否定前瞻:
^(?:(?!\$).){1,5}$
后者有点复杂,但它允许更多的灵活性,因此有必要注意。
前瞻是另一种形式的锚(它在某个位置匹配,但不会消耗它匹配的字符)。当用于附加量词({1,5}
位)的项目时,您需要将两个项目组合在一起才能正确应用。 (即如果你只做了(?!\$).{1,5}
,那么只会检查第一个字符的负向前瞻,而不是全部五个。)
请注意,字符类$
之外必须转义为\$
,以防止它的“字符串结束锚”的特殊含义。在角色类中,它只是一个普通角色。
(希望这个解释很清楚 - 如果有进一步的信息或说明有用,请告诉我。)
答案 1 :(得分:1)
您的正则表达式^(([^0]{1})([0-9])*|(0{1}))?$
可以简化一点。您似乎希望单个数字前面有0或最多2个数字。
试试这个:^\d{2}$
答案 2 :(得分:0)
将$添加到您不允许的一系列字符怎么样?
pattern="[^$]"