2013-05-21 21 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(在它之前不需要反斜杠)。 –