0

我正在处理一些不同的表单验证类型,但我无法让我的愿望清单上的所有项目正常工作。

我的 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" >

...而且它工作得很好——除了一个问题: a$是允许的。

所以我想也许我可以用这样的正则表达式添加它:

    <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" > 

但我的模式当然只是将其限制为数字,我已经在这样做了。我需要我的模式来排除美元符号。但作为一个特殊角色,它的行为不像我想摆脱的其他东西。

有什么想法或建议吗?我尝试过的一切要么不起作用,要么破坏页面上的所有其他验证。

4

3 回答 3

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 的任何数字。

..是为了确保and仍然适用于整个字符串(?:)^$

(当然,您也可以^\d{1,2}$稍后使用 then 检查它是否小于 24。)


奖励信息:不包括字符

如上所述,在这种情况下您不需要这样做,但如果您遇到确实需要 exclude 的情况$,您可以使用否定字符类来执行此操作:

^[^$]{1,5}$

或使用负前瞻:

^(?:(?!\$).){1,5}$

后一个有点复杂,但它允许更大的灵活性,因此需要注意。

前瞻是另一种形式的锚(它匹配一个位置,但不消耗它匹配的字符)。当用于附加了量词({1,5}位)的项目时,您需要将两个项目组合在一起才能正确应用。(即,如果您只进行(?!\$).{1,5}负前瞻,则只会检查第一个字符,而不是全部五个。)

请注意,$必须对字符类之外的字符进行转义,\$以防止它具有“字符串锚结尾”的特殊含义。在字符类中,它只是一个普通字符。

(希望这个解释很清楚 - 如果进一步的信息或澄清有用,请告诉我。)

于 2012-12-04T18:12:44.473 回答
1

您的正则表达式^(([^0]{1})([0-9])*|(0{1}))?$可以简化很多。似乎您想要一个数字前面有一个 0 或最多 2 个数字。

尝试这个:^\d{2}$

于 2012-12-04T17:58:46.843 回答
0

将 $ 添加到您不允许的字符范围怎么样?

pattern="[^$]"
于 2012-12-04T17:58:07.190 回答