2014-03-07 48 views
0

我對switch()的理解是避免重複字符串。爲什麼switch()不支持regex?

如果是這樣,它爲什麼不支持正則表達式,如下面的代碼?還是我錯過了switch()

switch($username){ 
    case "": 
    array_push($errors, "Username cannot be blank"); 
    break; 
    case "admin": 
    array_push($errors, "Username cannot be 'admin'"); 
    break; 
    case regex_switch('/xxx.*/'): 
    array_push($errors, "Username cannot begin 'xxx'"); 
    break; 
} 
+0

在'之開關的值與每個'case'值(即'($用戶名==' admin')'。你不能將一個值與一個正則表達式進行比較,你可以,但它會和你的函數返回的值進行比較,例如'($ username == regex_switch('/ xxx。* /'))' 。這就是'switch'es的工作原理。 –

回答

5

切換不是一般的條件語句,而是比較值。把它想象成擴展到一系列if語句。

例如,認爲以下(僞代碼):

switch(a) { 
    case x: ... break; 
    case y: ... break; 
    case z: ... break; 
} 

至於擴大到類似:

if (a == x) { 
} 
elseif (a == y) { 
} 
elseif (a == z) { 
} 

所以在你的情況下,一個正則表達式,最終被:

if (a == regex_switch(...)) { 
} 

其中A是字符串...

0

因爲它沒有。故事結局。

教訓是你需要想辦法約束,而不是請求PHP開發人員實現一些深奧的功能,並沒有在這個過程中完成任何工作。

爲什麼不:

$disallowed_usernames = array(
    array('/^$/', 'be blank'), 
    array('/^admin/', 'begin with "admin"'), 
    array('/^xxx/', 'begin with "xxx"'), 
); 

foreach($disallowed_usernames as $item) { 
    if(preg_match($item[0], $username)) { 
    array_push($errors, 'Username cannot ' . $item[1]); 
    break; 
    } 
} 
+0

沒有上訪,只是想了解'switch()',但是好方法。 – rybo111

0

你可以這樣做:

switch $username { 
    case "": 
    array_push($errors, "Username cannot be blank"); 
    break; 
    case "admin": 
    array_push($errors, "Username cannot be 'admin'"); 
    break; 
    case (preg_match('/^xxx.*/', $username) ? true : false) : 
    array_push($errors, "Username cannot begin 'xxx'"); 
    break; 
}