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

Php 这个正则表达式我做错了什么?,php,regex,Php,Regex,老实说,我真的不懂正则表达式。所以我完全不知道我在哪里出了错 我正在寻找一个只接受字母数字字符的正则表达式(加下划线表示用户名)。我在这里搜索了很多我尝试过的示例正则表达式,但没有一个有效 在其他方面,我主要是从这里的答案中得到的,我已经尝试过了 ^[a-zA-Z0-9_]*$ /[^a-z_\-0-9]/i /^\w+$/ 为了匹配这些,我尝试了(使用每个正则表达式) 及 及 及 等等。。。 每次它接受特殊字符时(我尝试了&、$、^和%) 我到底做错了什么?它是正则表达式的格式吗?这是我要求

老实说,我真的不懂正则表达式。所以我完全不知道我在哪里出了错

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

在其他方面,我主要是从这里的答案中得到的,我已经尝试过了

^[a-zA-Z0-9_]*$
/[^a-z_\-0-9]/i
/^\w+$/
为了匹配这些,我尝试了(使用每个正则表达式)

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

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

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

使用严格相等运算符(==)意味着我们要比较preg_match()返回的值是1,即数字,而不是布尔值。如果它返回0,则表示没有匹配项、布尔值为false、错误为occored。查看
preg\u match
页面了解更多信息:

Per*preg\u 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.";
}
如果输入字符串与您给定的模式匹配,则返回1,如果不匹配,则返回0

您希望用户名中的每个字符都是字母数字(加下划线)。一种PCRE的表达方式是用一个内方括号,如下图所示:
[a-Za-z0-9.]
。有几种方法可以使用这个基本类来实现您想要的功能

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

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

if (preg_match('/[^A-Za-z0-9_]/',  $username)) {
    // invalid username
}
if (preg_match('/^[A-Za-z0-9_]+$/', $username)) {
    // valid username
}
或者,您可以进行相反类型的匹配,即为有效用户名提供一个模式,并检查是否匹配该模式。这一次,我们根本不改变字符类本身,而是在它后面添加了
+
量词,这意味着我们匹配了一个或多个“好”字符

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

最终结果是一个模式,表示“1个或多个字母数字字符(加下划线)而不是其他字符。”此模式上的匹配表示有效用户名:

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

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

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

  • ^[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
    
    [^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
    
    ^ // 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
    
    匹配字符串,例如:

    (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
    
    !
    a>a
    A<9
    ffffffffff.dflskfdfd
    00000,
    ]]]]]]]]]]]]]]]]]]
    and so-on
    
    mike
    alice
    bob10
    0000000000
    1111
    9
    php
    user_example
    
  • 使用/[^a-z_U2;-0-9]/i字符串将匹配以下内容:

    ^ // 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
    
    [^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
    
    ^ // 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
    
    您没有添加*或?或者+在子集之后,因此基本上您只查找一个字符,并且因为您没有将regexp放在^和$signs之间,所以此表达式最终将匹配至少包含一个非A-Z或A-Z、或u符号、或-破折号或0-9数字的字符的任何文本

    匹配字符串,例如:

    (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
    
    !
    a>a
    A<9
    ffffffffff.dflskfdfd
    00000,
    ]]]]]]]]]]]]]]]]]]
    and so-on
    
    mike
    alice
    bob10
    0000000000
    1111
    9
    php
    user_example
    
    可能是最有用的正则表达式。记住,\w只是[a-zA-Z0-9]的别名。此regexp将只匹配不为空且仅包含字母数字字符和uu符号的整个字符串

    匹配字符串,例如:

    (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
    
    !
    a>a
    A<9
    ffffffffff.dflskfdfd
    00000,
    ]]]]]]]]]]]]]]]]]]
    and so-on
    
    mike
    alice
    bob10
    0000000000
    1111
    9
    php
    user_example
    
  • 希望有帮助。对您来说,匹配有效用户名最有用的表达式imvho是/^\w{3,15}$/,因为它将匹配任何长度为3到15个字符且仅由字母数字字符和下划线符号(a-z a-z 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';
    

    您可能需要
    /^[:alnum:][u]+$/
    。如果(preg\u match('/[^\\w]/',$username)==1),请尝试此
    。为了便于测试,请查看您的所有正则表达式模式是否正确。您的使用或处理逻辑错误。可能在其他地方,@CodeGnome No,这不会解决op的问题-你能指出为什么他/她的其他模式是错误的,而你的模式是正确的吗?-1解释不了什么。废话。所以这不是代码交换。“OP显然在理解逻辑上有问题。”马里奥,我不同意。明确的“好用户名”和带有“坏用户名”的
    else
    ,用于演示比较应该如何工作。看看op的第一个例子——他/她有相反的逻辑。不管怎样,这几乎不值得投反对票。@Madbreaks:事实上,它现在应该投两票。这个迟钝的人不仅抄袭了另一个答案的事实真相,而且毫无意义。该函数在此上下文中只能返回一个trueish值。除了cargo cult编程之外,严格的比较还有什么其他用途?@mario可以更好地控制和理解preg_match()的工作原理,从而使OP能够防御性编程。它更显式,对于任何具有多个可能返回类型的函数,PHP开发人员都应该习惯于使用它。@mario