3

老实说,我真的不懂RegEx。所以我完全不知道我在哪里出错了。

我正在寻找一个接受字母数字字符的正则表达式(和下划线,它用于用户名)。我在这里搜索过,发现了许多我尝试过的示例 RegEx,但没有一个有效。

其中,我主要是从这里的答案中得到的,我试过了

^[a-zA-Z0-9_]*$
/[^a-z_\-0-9]/i
/^\w+$/

为了匹配这些,我尝试过(使用每个正则表达式)

   if(preg_match("/^\w+$/", $username)) { 
     //don't accept 
   }

 if(!preg_match("/^\w+$/", $username)) {
      //don't accept
    }

if(preg_match("/^\w+$/", $username) == 1) {
      //don't accept
    }

if(preg_match("/^\w+$/", $username) == 0) {
  //don't accept
}

等等...每次它都接受特殊字符(我尝试过 &、$、^ 和 %)。

我在这里到底做错了什么?是正则表达式的格式吗?这是我要求它检查的方式吗?

另外,如果找到特殊字符,我得到的返回类型到底是什么?(即我不想接受的)

4

4 回答 4

7

preg_match如果输入字符串与您提供的模式匹配,则返回 1,否则返回 0。

您希望用户名中的每个字符都是字母数字(加上下划线)。一种 PCRE 表达方式是在方括号内使用字符类[A-Za-z0-9_],例如: . 有几种方法可以使用这个基本类来做你想做的事。

一种方法是“否定”搜索:尝试匹配字母数字字符,如果匹配,则测试失败。为此,我们只需在字符类的前面添加一个克拉。这意味着我们正在匹配不在该集合中的任何字符。

因此,以下模式匹配“任何非字母数字、非下划线字符”。在这里,匹配意味着无效的用户名:

if (preg_match('/[^A-Za-z0-9_]/',  $username)) {
    // invalid username
}

或者,您可以进行相反类型的匹配,为有效用户名提供一个模式并检查您是否匹配。这一次,我们根本不改变字符类本身,而是+在它之后添加量词,这意味着我们正在匹配一个或多个“好”字符。

此外,我们将字符串的开头^$结尾锚点包裹在我们的模式周围。(这有点令人困惑,但模式开头的克拉与括号内字符类开头的克拉的含义完全不同)。

最终结果是一个模式,意思是:“1 个或多个字母数字字符(加上下划线),仅此而已。” 这个匹配意味着一个有效的用户名:

if (preg_match('/^[A-Za-z0-9_]+$/', $username)) {
    // valid username
}
于 2013-01-05T00:12:31.420 回答
2
if (preg_match("^[a-zA-Z0-9_]+$", $username) === 1) {
    // Good username
}
else {
    // Bad username
}

使用严格相等运算符 (===) 意味着我们正在比较 preg_match() 返回的 1,即数字,而不是布尔值。如果它返回 0,则表示没有匹配项,布尔值 false,发生错误。查看页面了解preg_match更多信息: http: //php.net/manual/en/function.preg-match.php

于 2013-01-05T00:09:48.453 回答
0

根据PHP 手册, *preg_match* 如果找不到与您的正则表达式匹配的成功,则返回 0,如果发生 en 错误,则返回 FALSE。因此,如果您想确保您正在测试 0,而不是可以评估为假的东西,您应该使用===运算符。

如果您只需要字母和下划线,您可以使用一个字符类,[a-z_]它指定 a 到 z 的字符范围和_符号将匹配。并且+下面的类指定你想要一个或多个相同的。^表示模式必须从文本的开头匹配,而表示$模式必须匹配到文本的结尾。

if (preg_match("/^[a-z_]+$/i", $text_variable) === 1) {
    //"A match was found.";
} else {
    //"A match was not found.";
}
于 2013-01-05T00:10:35.693 回答
0

如果您掌握了基础知识,则正则表达式很容易理解:)

我将尝试向您解释您尝试过的所有三种表达方式:

  1. 使用^[a-zA-Z0-9_]*$字符串将匹配:

    ^ // from the beginning...
    
    [a-zA-Z0-9_] // contains only characters a-z or A-Z or 0-9 or _ sign
    
    * // and has 0 or more of such characters
    
    $ // to the end
    

    匹配的字符串例如:

    (empty string - since you told 0 or more characters)
    abc09
    fidjwieofoj4fio3j4fiojrfioj3ijfo
    000000000000000000000
    __________
    and_many_many_more_as_long_as_they_contain_alpha_characters_and___sign
    
  2. 使用/[^a-z_-0-9]/i字符串将匹配:

    [^a-z_\-0-9]
    // ^ means "the opposite" so that subset describes characters
    // which are not included in it
    // (are not a-z or _ sign, or - dash sign, or 0-9 numbers)
    
    i modifier
    // stands for case insensitive, all letters are treated as lowercase
    

    您没有添加 * 或 ? 或 + 在子集之后,所以基本上你只是在寻找一个字符,并且因为你没有把你的正则表达式放在 ^ 和 $ 符号之间,这个表达式最终将匹配任何包含至少一个不是 AZ 或 az 的字符的文本,或者_ 符号,或 - 破折号,或 0-9 个数字。

    匹配的字符串例如:

    !
    a>a
    A<9
    ffffffffff.dflskfdfd
    00000,
    ]]]]]]]]]]]]]]]]]]
    and so-on
    
  3. /^\w+$/字符串将匹配:

    ^ // from the beginning
    \w // contains only characters a-z or A-Z or 0-9 or _ sign
    + // and the string must be at least 1 character long
    $ // to the end
    

    可能是最有用的正则表达式。请记住,\w只是 [a-zA-Z0-9_] 的别名。此正则表达式将仅匹配非空且仅包含字母数字字符和 _ 符号的整个字符串。

    匹配的字符串例如:

    mike
    alice
    bob10
    0000000000
    1111
    9
    php
    user_example
    

希望有帮助。对您来说,匹配有效用户名的最有用的表达式 imvho 是/^\w{3,15}$/因为它将匹配任何长度为 3 到 15 个字符且仅包含字母数字字符和下划线符号 (az AZ 0-9_)。

尝试这个:

<?php

function isValidUsername($username)
{
    return preg_match('/^\w{3,15}$/', $username) == 1;
}

echo isValidUsername('mike999') ? 'Yes' : 'No' , '<br>';
echo isValidUsername('alice!') ? 'Yes' : 'No';

干杯。

于 2013-01-05T01:08:28.870 回答