正则表达式只允许1个字符

时间:2009-08-15 15:01:56

标签: php regex

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

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

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

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

&LT; &GT; ,“@?= |;#

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

6 个答案:

答案 0 :(得分:5)

表达后有$,开头有^,表示您接受完全一个字符。

编辑(根据评论):

您可以尝试查看输入字段是否具有有效字符,方法是将其匹配(如果匹配,则表示没有无效字符):

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

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

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

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

答案 1 :(得分:2)

你可能真正需要的是:

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

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

这相当于通过对正则表达式的这一小改动来执行您目前所做的事情:

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

但这是一种无意义的过度复杂。就像通过计算房间里有多少东西不是大象来试图找出房间里是否有大象一样,然后看看这个数字是否与房间里的东西相同。 (并且/i修饰符在任何时候都不会完成任何事情。)

答案 2 :(得分:1)

您需要'/^[^<,"@$?=>|;#]+$/i''/^[^<,"@$?=>|;#]*$/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

答案 3 :(得分:1)

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

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

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

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

答案 4 :(得分:0)

^表示行的开头
$表示行尾 []表示匹配一组角色中的一个

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

答案 5 :(得分:0)

可能"/(.*?)[^<,"@$?=>|;#]/i"或“/^[^<,"@$?=>|;#].*+$/i"

不确切地知道你想要做什么