【问题标题】:Regular Expression - Small change needed正则表达式 - 需要小改动
【发布时间】:2010-07-31 14:59:51
【问题描述】:

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

这个正则表达式也适合检查 a 到 z 和 0 到 9,或者有什么办法可以改进。

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

谢谢

【问题讨论】:

  • 这是 PHP 吗?在询问正则表达式问题以获得最有用的答案时,请始终指定风格。

标签: php regex preg-match


【解决方案1】:

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

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

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

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

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

因此,正则表达式 [^A-Za-z0-9] 实际上匹配一个既不是字母也不是数字的字符。这就是为什么preg_match 的结果被! 否定的原因。

即上述方法的逻辑使用了双重否定

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

【讨论】:

  • 感谢您的更正,也感谢您将我指向 ctype_alnum。我从来不知道 php 有这样的功能。我想我会从现在开始使用它。
  • +1 您是正则表达式方面的专家,请在我的回答中检查正则表达式:stackoverflow.com/questions/3381331/…
【解决方案2】:

虽然我不反对正则表达式,但对于这样一个简单的模式,您可能应该考虑使用

if(ctype_alnum($input)) {

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

【讨论】:

  • 刚刚在这里发现了这个功能 :-) 它让事情变得非常简单。从现在开始将使用它。
【解决方案3】:

您可以将 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); 您拥有的实际上是一个否定字符类,因此它会 disallow 括号内的任何内容。不过,我可能误解了你的目的。

【讨论】:

  • 您的修改看起来可能只适用于单个字符串。
  • 哎呀,这是一个错字。谢谢,修好了。
猜你喜欢
  • 1970-01-01
  • 2016-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-01
相关资源
最近更新 更多