1

我有一个字符串,我需要测试以查看 [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

4

5 回答 5

2

非正则表达式解决方案怎么样?

演示

$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()

于 2013-05-21T18:52:51.183 回答
0

只需这样做:

if (preg_match('~^C[0-9]{8}$~', $str))
    ...true...
else
    ...false...
于 2013-05-21T18:39:01.853 回答
0

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

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

于 2013-05-21T18:39:10.460 回答
0

最简单的正则表达式是

/^C\d{8}$/

您可以使用它,preg_match所以sub_str不需要。或者,如果您希望它匹配任何字母而不仅仅是 aC开头,您可以使用

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

这将匹配字符串开头的大小写字母

于 2013-05-21T18:47:41.107 回答
0

首先,您substr()在几个方面使用错误。第三个参数是要返回的子字符串的长度,从第二个参数给定的位置开始。

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
于 2013-05-21T18:50:03.820 回答