2010-04-08 62 views
1

如何检查并查看用户是否只输入数字,并且使用PHP至少有4个数字?PHP验证问题

+1

请先尝试编写代码; http://www.php.net是一个很好的参考。 – 2010-04-08 20:50:24

+2

@TaG,这似乎有点不受欢迎。 – 2010-04-08 20:56:39

+0

RTFQ人!由于某种原因,对这个问题的回答很多。 – notJim 2010-04-08 20:57:21

回答

5

你可以使用正则表达式:

/^\d{4,}$/ 

用法示例:

$s = "7325"; 
if (preg_match('/^\d{4,}$/', $s)) { 
    echo "matches"; 
} 
+2

你可以使用'preg_match()'检查你可以使用' – 2010-04-08 20:52:13

+0

@Alexandre Jasmin,谢谢:) – TaG 2010-04-08 20:53:52

+0

@Alexandre:好点 - 我已经添加了一些示例代码。 – 2010-04-08 20:55:46

0

你有任何示例代码开始吗?

要严格回答你的问题,你可以使用像if(preg_match('/^\d{4,}$/', $input)...这样的正则表达式。

但是这里还有很多需要考虑的事情:您需要考虑验证和过滤(并且最好保留两个单独的问题)。如果你严格检查一个整数,那么我认为你可以安全地使用SQL注入,XSS等,但是你真的需要处理这些问题,因为迟早你需要过滤&验证除简单整数以外的其他内容。

+0

intval('0000')为0,即使它是四位数字,并且长度为4或更大,它将对您无效。 – notJim 2010-04-08 20:56:51

6

马克·拜尔斯的建议是很好的,但这里的另一种方式:

$valid = ctype_digit($number) && strlen($number) >= 4; 
+1

我喜欢这个,因为(如Mark的)'0123'符合条件,并且不使用正则表达式引擎。 – webbiedave 2010-04-08 20:58:11

+0

@notJim,你赢得了我的投票,因为你的最高性能:) – 2010-04-08 21:12:46

1

ctype_digit()& &的strlen()获得

<?php 

function benchmark($callback){ 
    echo sprintf('%-30s: ', $callback); 
    $t = microtime(true); 
    foreach(range(1, 10000) as $n){ 
    call_user_func($callback); 
    } 
    echo (microtime(true)-$t)."\n"; 
} 

function mark_byers_preg_match(){ 
    $s = "7325"; 
    preg_match('/^\d{4,}$/', $s); 
} 

function notjim_ctype_digit_strlen(){ 
    $number = 7325; 
    ctype_digit($number) && strlen($number) >= 4; 
} 

function tomalak_intval_broken(){ 
    $check = 7325; 
    intval($check) == $check && $check >= 1000 && $check <= 9999; 
} 

benchmark('mark_byers_preg_match'); 
benchmark('notjim_ctype_digit_strlen'); 
benchmark('tomalak_intval_broken'); 

?> 

结果

mark_byers_preg_match   : 0.029040098190308 
notjim_ctype_digit_strlen  : 0.026585817337036 
tomalak_intval_broken   : 0.019872903823853 

注意: @ Tomalak's没有与开始0数字将不起作用,因此不符合


编辑: @除去kiethjgrant的解决方案,因为intval(0000)评估为false当它应该是true

+0

与数字这附近,没有赢家。另外,由于OP说,这是用户输入,所有输入将是字符串。 – Gordon 2010-04-08 21:14:17

+0

我很欣赏这种努力,但这是所有毫无意义,过早微观优化的母亲。 – notJim 2010-04-08 21:21:27

+0

@notJim,“所有毫无意义的母亲”和“不成熟”都是没有意义的。有时结果会有很大的不同,只需要大约2分钟的时间将解决方案复制/粘贴到脚本中。有什么危害? – 2010-04-08 21:55:51

0

你应该总是用最有效的方式做到这一点

if (is_numeric($imput) && isset($input[3])) 
{ 
    // your code 
} 

isset()函数是一个语言结构,它总是快于strlen的()。 ($ input [n-1])告诉你string(通过form的数据总是字符串)是否至少有n个long。

is_numeric()检查它是一个有效的数字字符串。

我认为它比ctype_digit()更好& & strlen()。

+0

is_numeric验证更多,然后只是数字。 – OIS 2010-04-08 23:28:31