2013-05-21 47 views
1

我有一個字符串,我需要測試以查看[0]字符(最先)後面的字符是否爲數字。Preg_match和substr在一起

所以例如:

C爲[0]

然後我需要檢查,如果剩餘的字符都只有數字意味着℃之後,我們得到:

使字符串C12345678

這是我試過的:

elseif(substr($str, 1, preg_match("/^[0-9]/", $str) === FALSE)) 
    { 
     $this -> set_message('is_valid_student_id', 'Must have 8 digits 0 - 9'); 
     return FALSE; 
    } 

第一個字符總是一個字符,最後8個字符總是數字。

感謝

編輯1:

所以做什麼你們告訴我,不給我預期的結果...

elseif (preg_match("/^\c\d{8}$/i", $str) === FALSE) // Lower case cC + 8 digits 
    { 
     $this -> set_message('is_valid_student_id', 'must have 8 digits 0 - 9'); 
     return FALSE; 
    } 

沒有返回FALSE即使我在第一個字母后鍵入一個字母[c或C]

+0

它總是*第一個字符後的八位數?怎麼樣的正則表達式如下: /^ \ D \ d {8} $/ – Mike

+0

是的,無論如何,它會始終是第一個字母后8位數字。 – user2406611

+0

你的語法看起來不正確,你傳遞preg_match作爲substr的第三個參數? – Dropzilla

回答

2

如何在非正則表達式的解決方案?

DEMO

$student_id = "C123b5678"; 

if(ctype_alpha($student_id[0])){ 
    if(ctype_digit(substr($student_id,1,strlen($student_id) - 1))){ 
     echo 'valid'; 
    } 
    else{ 
     echo 'invalid'; 
    } 

} else { echo 'invalid starting character'; } 
// echoes invalid 

編輯:正如Cryode指出,is_numeric()過於寬泛這種應用。這將允許像C1e5這樣的字符串通過有效...使用ctype_digit()修復此問題。如果需要,還可以添加支票strlen()

+1

你會因爲沒有做最簡單最耗時的方式而對自己生氣?因爲我只是做了...這非常簡單,在拍攝錯誤信息時允許進行大量的自定義,並且效果非常好!非常感謝。 – user2406611

+0

Every.single.day。 :)很高興它幫助你。快樂的編碼! – brbcoding

+0

'is_numeric()'對於這個應用來說太廣泛了。例如,使用此代碼,學生ID「C1e5」通過有效。 –

0

只需做這個:

if (preg_match('~^C[0-9]{8}$~', $str)) 
    ...true... 
else 
    ...false... 
0

if (preg_match('/.\d+/'))怎麼樣? .部分說「任何長度爲1的符號」; \d+僅爲數字,出現一次或多次。

更新: 要拒絕第一個位置的數字,請使用 preg_match('/[^\d]\d+/')

+1

初始'.'將允許任何意味着'123456789'和'!123456789'匹配 –

0

這個最簡單的正則表達式將是

/^C\d{8}$/ 

,你可以只用preg_match使用,因此沒有sub_str將需要。另外,如果你想讓它匹配任何字母,而不僅僅是一個C,首先,你可以使用

/^[a-z]\d{8}$/i 

這將在字符串的開頭

+0

我已使用編輯更新了我的OP – user2406611

+1

@ user2406611您在編輯中的c之前有一個反斜槓。試試這個'/^C \ d {8} $ /我' –

+0

我會投你一票,幫助和給我一個更好的理解正則表達式,但我在需要的點 – user2406611

0

首先大寫和小寫字母匹配,你用幾種方法錯誤地使用了substr()The third parameter是要返回的子字符串的長度,從第二個參數中給出的位置開始。

substr()如果函數失敗,也會返回false,如果沒有正匹配則返回。對於這樣的功能,您需要strpos()

您可以自己使用preg_match()來驗證短字符串的結構。

假設:

  • 第一個字符將永遠是一個字母
  • 其餘字符將始終是數字。

我們可以利用這一點:

preg_match('/^[a-zA-Z]\d+$/', $str) 

如果你的第一個字符應該僅僅是一個大寫字母,你可以刪除a-z部分(或反之爲小寫)。

如果號碼中的數字將是一個特定的長度,你可以指定使用{X}

preg_match('/^[a-zA-Z]\d{8}$/', $str) // Exactly 8 numbers 
+0

我已經更新我的OP與編輯 – user2406611

+0

你不逃避C(在它之前不需要反斜槓)。 –