2013-01-05 148 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'; 

乾杯。