2013-01-05 113 views
3

说实话,我并不真得到 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的格式吗?这是我要求它检查的吗?

此外,如果发现特殊字符,我得到的返回类型究竟是什么? (即,一个我希望接受)

+0

您可能想要'/^[[:alnum:] _] + $ /'。 –

+0

试试这个'if(preg_match('/ [^ \\ w] /',$ username)== 1)'。为了方便测试,请看[this](http://www.functions-online.com/preg_match.html) – atomman

+0

您所有的正则表达式模式都是正确的。您的使用或处理逻辑错误。可能在其他地方, – mario

回答

7

preg_match返回1,如果输入的字符串匹配你给格局,0,如果它没有。

您希望用户名中的每个字符都是字母数字(加下划线)。一种PCRE表达方式是在方括号内使用character class,如下所示:[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 
} 
+1

这两个表达式之间的语法差异非常小 - 很明显地指出它们之间的区别。 – Madbreaks

+0

谢谢,并感谢你解释得很好。我为此采取了“积极”的态度。保持积极,我说。 – nerdarama

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

使用全等运算符(===)的意思是我们要比较什么的preg_match()返回1,数量,而不是布尔值。如果返回0,则表示没有匹配,布尔错误,错误发生。检查出preg_match的页面了解更多信息:http://php.net/manual/en/function.preg-match.php

+0

+1使用严格等于 – Madbreaks

+0

-1没有任何解释。 Zilch文本。 SO不是代码交换。而OP显然对理解逻辑有问题。 – mario

+1

@mario我不同意。明确的“好用户名”和“别名”用“坏用户名”来表明比较应该如何工作。看看op的第一个例子 - 他/她有逻辑倒退。无论如何,这几乎不值得赞扬。 – Madbreaks

0

the PHP manual * *的preg_match将返回0,如果不能找到成功的匹配与你的正则表达式和FALSE如果连接出现错误。所以如果你想确保你测试的是0,而不是可以评估为false的东西,你应该使用===运算符。

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

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

我也试过假。我的意思是“etc ...” – nerdarama

+0

不,preg_match返回*零*如果找不到匹配。 – Madbreaks

+0

Madbreaks - 你是对的..让他们交换。 –

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] /我字符串将要匹配:

    [^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'; 

干杯。