这个正则表达式我做错了什么?

时间:2013-01-05 00:04:44

标签: php regex

说实话,我并没有获得 RegEx。所以我完全忘记了我在这里出错的地方。

我正在寻找一个接受字母数字字符的RegEx(和下划线,它是用户名)。我在这里搜索过,发现了很多我尝试过的RegExes示例,其中没有一个有效。

其中,我大部分都是从这里的答案中得到的,我试过了

^[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
}

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

我到底错在了什么?它是RegEx的格式吗?这是我要它检查的方式吗?

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

4 个答案:

答案 0 :(得分:7)

如果输入字符串与您给出的模式匹配,则

preg_match返回1,如果输入字符串不匹配,则返回0。

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

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

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

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

或者,你可以做相反的匹配,在那里你给出一个有效用户名的模式,并检查你是否匹配。这一次,我们根本不会更改角色类本身,但我们会在其后添加+量词,这意味着我们正在匹配的一个或多个 #34;良好"字符。

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

最终结果是一种模式,意思是:"一个或多个字母数字字符(加上下划线)和别的。"与此匹配意味着有效用户名:

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

答案 1 :(得分:2)

if (preg_match("^[a-zA-Z0-9_]+$", $username) === 1) {
    // Good username
}
else {
    // Bad username
}

使用严格相等运算符(===)意味着我们将preg_match()返回的值与数字进行比较,而不是布尔值。如果它返回0,则表示没有匹配,布尔值为false,发生错误。有关详细信息,请查看preg_match页面:http://php.net/manual/en/function.preg-match.php

答案 2 :(得分:0)

Per the PHP manual * preg_match *如果找不到与正则表达式成功匹配则返回0,如果发生错误则返回FALSE。因此,如果您要确保测试0,而不是可以评估为false的内容,则应使用===运算符。

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

if (preg_match("/^[a-z_]+$/i", $text_variable) === 1) {
    //"A match was found.";
} else {
    //"A match was not found.";
}

答案 3 :(得分: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
    
  4. 希望有所帮助。对于您来说,匹配有效用户名的最有用的表达式是 / ^ \ 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';
    

    干杯。