【问题标题】:Regex allows only 1 character正则表达式只允许 1 个字符
【发布时间】:2009-08-15 23:30:57
【问题描述】:
$rex = '/^[^<,"@?=>|;#]$/i';

我在使用这个正则表达式时遇到了问题。这个想法是检查输入字段中的某些字符,如果存在,则抛出错误。

这个正则表达式会为每个长度超过 1 个字符的字符串抛出错误。谁能告诉我我做错了什么?

编辑:人们说他们看不到我想用这个正则表达式做什么。如果以下字符之一是输入的字符串的一部分,我想要做的是拒绝输入:

, " @ ? = | ; #

EDIT2:JG 的“有效”正则表达式可以解决问题。

【问题讨论】:

    标签: php regex


    【解决方案1】:

    你的表达式后面有$,开头有^,这意味着你接受完全一个字符。

    编辑(基于 cmets):

    您可以尝试查看您的输入字段 only 是否有 valid 字符,通过将其与 this 进行匹配(如果匹配,则表示没有无效字符):

    $rex = '/^[^<,"@$?=>|;#]+$/i'
    

    您也可以反过来,即使用 chaos 提供的正则表达式测试您的输入字段是否有任何无效字符:

    $rex = '/[<,"@$?=>|;#]/';
    

    这样,如果正则表达式匹配,则表示您的字符无效。

    【讨论】:

    • 您可能希望同时删除 ^ 和 $。如果在保留 ^ 的同时删除 $,则只会匹配表达式开头的一个字符。
    • 同时删除 ^ 和 $ 意味着它将验证任何字符串,只要它包含有效字符,因此不需要。
    • 您可以尝试查看您的输入字段是否只有有效个字符,方法是将其与此匹配:'/^[^&lt;,"@$?=&gt;|;#]+$/i'。您也可以反过来,即测试您的输入字段是否有任何 invalid 字符,使用 Chaos 提供的正则表达式:$rex = '/[&lt;,"@$?=&gt;|;#]/';。这样,如果正则表达式匹配,则意味着您的字符无效。
    • 无效的正则表达式显示不匹配,无论我输入正确还是错误的输入。例如,我的用户名是错误的 preg_match()
    【解决方案2】:

    你可能真正需要的是:

    $rex = '/[<,"@$?=>|;#]/';
    

    那么你的错误情况是当这个正则表达式匹配时,而不是当它不匹配时。

    这相当于做你目前正在做的对你的正则表达式的这个小改动:

    $rex = '/^[^<,"@?=>|;#]*$/i';
    

    不过,这有点荒谬地过于复杂。就像试图通过计算房间里有多少东西不是大象来找出房间里是否有大象,然后看看这个数字是否与房间里的东西数量相同。 (而/i 修饰符在任何时候都不会完成任何事情。)

    【讨论】:

      【解决方案3】:

      您只要求一个字符。如果您想要多个字符,请重复该模式,就像这样(一次或多次):

       $rex = '/^[^<,"@?=>|;#]+$/i';
      

      或像这样(零次或多次):

       $rex = '/^[^<,"@?=>|;#]*$/i';
      

      【讨论】:

        【解决方案4】:

        你会想要'/^[^&lt;,"@$?=&gt;|;#]+$/i''/^[^&lt;,"@$?=&gt;|;#]*$/i'

        举个例子:

        $valid = 'Hello';
        $invalid = 'h<i';
        $regex = '/^[^<,"@$?=>|;#]+$/i';
        
        print "'$valid' gives ".preg_match($regex, $valid)."\n";
        print "'$invalid' gives ".preg_match($regex, $invalid)."\n";
        

        哪些输出:

        'Hello' gives 1
        'h<i' gives 0
        

        我所做的只是在你的字符组后面加上一个+或*。

        在正则表达式中,*表示匹配0次或多次,+表示匹配1次或多次。

        由于 ^ 表示字符串的开头,$ 表示结尾,没有 + 或 *,你告诉它匹配一个字符串,该字符串恰好由一个非特殊字符的出现组成,因此为什么如果你的字符串是错误的超过一个字符。

        如果您愿意,您还可以删除表达式末尾的 i,因为当您的表达式中不涉及任何字母时,您不需要进行不区分大小写的匹配。

        有关正则表达式的更多信息,请查看Regular-Expressions.info

        【讨论】:

        • 现在没有匹配项。我的键盘上没有任何字符可以匹配。
        • 这对我来说似乎很奇怪。我将编辑一个适合我的示例。
        【解决方案5】:

        ^ 表示行首
        $ 表示行尾
        [] 表示匹配一组字符中的一个

        您将匹配该列表中包含一个且仅包含一个的行。

        【讨论】:

        • 所以我必须避开中间的美元符号?
        • 否,因此您必须限定集合以要求倍数。将 + 或 * 放在排除集之后,分别表示您想要一个或多个或零个或多个。
        【解决方案6】:

        也许是"/(.*?)[^&lt;,"@$?=&gt;|;#]/i" 或“/^[^&lt;,"@$?=&gt;|;#].*+$/i"

        不知道你到底想做什么

        【讨论】:

        • 所有这些随机字符都是我希望禁止的字符。如果其中任何一个出现,则拒绝输入。如果不存在,则接受输入。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多