我需要一个只允许a到z和0到9的正则表达式。我在这个网站上遇到了下面的函数,但是它允许通过几个符号(#.-)。如果只允许a到z(大写和小写)和0到9,应该怎么做?我很害怕编辑它,因为我对正则表达式一无所知。
这个正则表达式也适用于检查a到z和0到9,或者是否有任何可以改进的方式。
function isValid($str) {
return !preg_match('/[^A-Za-z0-9.#\\-$]/', $str);
}
由于
答案 0 :(得分:3)
在这种情况下,您似乎需要以下内容:
function isValid($str) {
return !preg_match('/[^A-Za-z0-9]/', $str);
}
[…]
正则表达式构造称为字符类。像[aeiou]
这样的东西与任何一个元音相匹配。
[^…]
是一个否定的字符类,因此[^aeiou]
匹配除了元音之外的任何一个(包括辅音,数字,符号)等等。)
-
,取决于它在字符类定义中的显示位置/方式,是范围定义,因此0-9
与0123456789
相同
因此,正则表达式[^A-Za-z0-9]
实际匹配既不是字母也不是数字的字符。这就是为preg_match
取消!
的结果的原因。
也就是说,上述方法的逻辑使用 double negation :
isValid = it's not the case that
there's something other than a letter or a digit
anywhere in the string
你可以选择摆脱双重否定并使用这样的东西:
function isValid($str) {
return preg_match('/^[A-Za-z0-9]*$/', $str);
}
现在没有否定。 ^
和$
是字符串锚点的开头,而*
是重复元字符的零或一。现在逻辑很简单:
isValid = the entire string from beginning to end
is a sequence of letters and digits
某些语言具有标准函数/惯用方法来验证字符串是否仅包含字母数字字符(以及其他可能的字符串“类型”)。
例如,在PHP中,您可以使用ctype_alnum
。
bool ctype_alnum ( string $text )
检查提供的字符串
text
中的所有字符是否为字母数字。
ctype
个函数系列的列表
ctype_alpha
,digit
,lower
,upper
,space
等答案 1 :(得分:2)
虽然我没有任何反对正则表达式的东西,但是你应该考虑使用
这么简单的模式if(ctype_alnum($input)) {
答案 2 :(得分:0)
您可以将z和0-9与[Zz0-9]
匹配,您可以将a-z和0-9与[a-z0-9]
匹配。如果你想要大写和小写,那么你可以使用[A-Za-z0-9]
。
有关详情,请参阅regular expression character classes。
此外,!preg_match()
并非真的有必要。相反,你可以在你想要的东西上使用正面匹配,例如return preg_match('/^[A-Za-z0-9]+$/', $str);
你拥有的那个实际上是一个否定的字符类,所以它将禁止括号内的任何东西。不过,我可能会误解你的目的。