正则表达 - 需要进行小的更改

时间:2010-07-31 14:59:51

标签: php regex preg-match

我需要一个只允许a到z和0到9的正则表达式。我在这个网站上遇到了下面的函数,但是它允许通过几个符号(#.-)。如果只允许a到z(大写和小写)和0到9,应该怎么做?我很害怕编辑它,因为我对正则表达式一无所知。

这个正则表达式也适用于检查a到z和0到9,或者是否有任何可以改进的方式。

function isValid($str) {
    return !preg_match('/[^A-Za-z0-9.#\\-$]/', $str);
}

由于

3 个答案:

答案 0 :(得分:3)

在这种情况下,您似乎需要以下内容:

function isValid($str) {
    return !preg_match('/[^A-Za-z0-9]/', $str);
}

[…]正则表达式构造称为字符类。像[aeiou]这样的东西与任何一个元音相匹配。

[^…]是一个否定的字符类,因此[^aeiou]匹配除了元音之外的任何一个(包括辅音,数字,符号)等等。)

-,取决于它在字符类定义中的显示位置/方式,是范围定义,因此0-90123456789相同

因此,正则表达式[^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中的所有字符是否为字母数字。

API链接

  • PHP Ctype Functions - ctype个函数系列的列表
    • ctype_alphadigitlowerupperspace

答案 1 :(得分:2)

虽然我没有任何反对正则表达式的东西,但是你应该考虑使用

这么简单的模式
if(ctype_alnum($input)) {

http://uk3.php.net/manual/en/function.ctype-alnum.php

答案 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);你拥有的那个实际上是一个否定的字符类,所以它将禁止括号内的任何东西。不过,我可能会误解你的目的。