Preg_match和substr在一起

时间:2013-05-21 18:34:55

标签: php regex string validation

我需要测试一个字符串,以查看[0]字符(第一个字符)后面的字符是否为数字。

所以例子:

C是[0]

然后我需要检查剩下的字符是否只是数字,这意味着在C之后我们得到:

12345678

制作字符串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;
     }

即使我在第一个字母[c或C]

之后输入一个字母,也不会返回FALSE

5 个答案:

答案 0 :(得分: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 :(得分:0)

只需这样做:

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

答案 2 :(得分:0)

if (preg_match('/.\d+/'))怎么样? .部分表示“长度为1的任何符号”; \d+仅为数字,一次或多次出现。

更新: 要禁止在第一个位置使用数字,请使用 preg_match('/[^\d]\d+/')

答案 3 :(得分:0)

最简单的正则表达式是

/^C\d{8}$/

您只能使用preg_match,因此不需要sub_str。或者,如果您希望它与任何字母匹配而不仅仅是C,那么您可以使用

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

这将匹配字符串

开头的大写和小写字母

答案 4 :(得分:0)

首先,您在某些方面使用substr()错误。 The third parameter是您要返回的子字符串的长度,从第二个参数中给出的位置开始。

如果函数失败,

substr()也将返回false,如果没有正匹配则不返回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