2010-09-19 60 views
5

只是一個簡單的問題,正在與正則表達式rubish,所以我認爲我會張貼在這裏。下面的正則表達式是驗證用戶名。php正則表達式驗證

  • 必須是4-26個字符之間

  • 開始與至少2個字母

  • 只能包含數字和一個 下劃線和一個點

我有這如此遠,但不起作用

<?php 

$username=$_POST['username']; 

if (!eregi("^([a-zA-Z][0-9_.]){4,26}$",$username)) 
{ 
return false; 
} 
else 
{ 
echo "username ok"; 
} 

?> 

謝謝:)

+9

'preg_match'是執行正則表達式匹配的首選方式。 'eregi'從PHP 5.3起就被棄用了,它的使用是「非常不鼓勵」的:http://php.net/eregi – rojoca 2010-09-19 20:51:45

+0

沒有,謝謝鏈接 – Elliott 2010-09-19 20:54:31

+0

請給出一些有效和無效用戶名的例子。你的規則是矛盾的(至少有兩個字母與唯一的數字)。 – kennytm 2010-09-19 21:54:41

回答

15

你可以在

<?php 

$username=$_POST['username']; 

if (!preg_match('/^(?=[a-z]{2})(?=.{4,26})(?=[^.]*\.?[^.]*$)(?=[^_]*_?[^_]*$)[\w.]+$/iD', 
       $username)) 
{ 
return false; 
} 
else 
{ 
echo "username ok"; 
} 

?> 
  • ^(?=[a-z]{2})使用正則表達式

    /^(?=[a-z]{2})(?=.{4,26})(?=[^.]*\.?[^.]*$)(?=[^_]*_?[^_]*$)[\w.]+$/iD 
    

    爲確保字符串 「開始與至少2個字母」。

  • (?=.{4,26})確保它「必須在4-26個字符之間」。
  • (?=[^.]*\.?[^.]*$)確保以下字符至多包含一個.直到結束。
  • 同樣(?=[^_]*_?[^_]*$)確保至多一個_
  • [\w.]+$提交匹配項。它也確保只涉及字母數字,_.

(注:此正則表達式假定hello_world是一個有效的用戶名。)

+0

讓它從更多的兩個字母開始,這將是完美的:)「從**至少** 2個字母開始」。 – 2010-09-19 21:20:29

+0

@Colin:應該修復。 – kennytm 2010-09-19 21:23:16

+0

但在在Sametime只能包含數字,所以最後字符必須是唯一的「\ d._」,並不能有任何數量的第一部分。這裏是基於你以前的正則表達式: – 2010-09-19 21:27:57

0

,你說的部分:

和一個下劃線和一個點

會引導我走的正則表達式是誠實的!

我會做這樣的事情:

if(!eregi('^[a-zA-Z]{2}$', substr(0,2))) { 
    // .... check for only 2 dots here later .... 
} 
+0

哈哈爲什麼.......? – Elliott 2010-09-19 20:38:50

+0

僅僅是因爲在這一點上編寫一些'for/else'代碼要容易得多。我確定有一個正則表達式,但它會很複雜! – 2010-09-19 20:42:48

+0

好點,感謝您的反饋:) – Elliott 2010-09-19 20:50:51

5

你在一個正則表達式,詢問了很多,這是可能的,但它是不是最好的方式,你希望讓用戶知道爲什麼他們的用戶名是錯誤。

function checkUsername($username) { 
    $username = trim($username); 
    if (empty($username)) { 
     return "username was left blank."; 
    }elseif (strlen($username) < 4) { 
     return "username was too short"; 
    }elseif (strlen($username) > 26) { 
     return "username was too long"; 
    }elseif (!preg_match('~^[a-z]{2}~i', $username)) { 
     return "username must start with two letters"; 
    }elseif (preg_match('~[^a-z0-9_.]+~i', $username)) { 
     return "username contains invalid characters."; 
    }elseif (substr_count($username, ".") > 1) { 
     return "username may only contain one or less periods."; 
    }elseif (substr_count($username, "_") > 1) { 
     return "username may only contain one or less underscores."; 
    } 

    return true; 
} 

那就要檢查一下你會怎麼做:

$validUsername = checkUsername($username); 

if ($validusername !== true) { 
    echo "An error occured: " . $validUsername; 
} 

這樣,用戶就知道有一個錯誤並解決它更容易,而不是被盲目的錯誤是什麼。你也應該停止使用ereg它已經摺舊使用preg_match來代替。

注意使用!==來檢查,這也檢查類型,因爲它可以返回一個字符串(這將返回一個真正的鬆散比較)。僅供參考。

+0

謝謝,它只回應'用戶名ok',因爲它被髮回到jquery函數。我確實有一個用戶名需求的要求清單,但我想你的方式更好。我會給它以前:) – Elliott 2010-09-19 21:02:16

+0

添加了2個開始字母的要求。 – 2010-09-19 21:04:53

+1

'preg_match('〜[a-z0-9 _。] +〜i',$ username)''將'foo @ bar'返回爲'1'爲'[a-z0-9 _。] +'匹配'foo' 。 – Gumbo 2010-09-19 21:04:59