我试图将字符串验证为一组数字。如果字符串只包含数字,那么函数应该验证,但in_array不工作,有什么建议吗?
$list = array(0,1,2,3,4,5,6,7,8,9);
$word = 'word';
$split = str_split($word);
foreach ($split as $s) {
if (!in_array($s, $list)) {
print 'asdf';
}
}
这是班级:
class Validate_Rule_Whitelist {
public function validate($data, $whitelist) {
if (!Validate_Rule_Type_Character::getInstance()->validate($data)) {
return false;
}
$invalids = array();
$data_array = str_split($data);
foreach ($data_array as $k => $char) {
if (!in_array($char, $whitelist)) {
$invalids[] = 'Invalid character at position '.$k.'.';
}
}
if (!empty($invalids)) {
$message = implode(' ', $invalids);
return $message;
}
return true;
}
}
答案 0 :(得分:2)
in_array与松散类型值的比较有点奇怪。在你的案例中有用的是:
$list = array('0','1','2','3','4','5','6','7','8','9');
$word = 'word';
$split = str_split($word);
foreach ($split as $s) {
if (!in_array($s, $list, true)) {
print 'asdf';
}
}
这会将字符串与字符串进行比较,并且不会产生任何意外。 但是,正如评论中已经指出的那样,这是非常错误的做事方式,使用 filter_var()或正则表达式** 来实现你的目标要好得多正在努力。
答案 1 :(得分:0)
有些事情应该有效:
<?php
$validate_me = '123xyz';
if(preg_match("/[^0-9]/", $validate_me, $matches))
print "non-digit detected";
?>
答案 2 :(得分:0)
它像罪一样丑陋但它有效,这里没有优雅的解决方案,只是一个双循环,如果你看到任何问题请告诉我
$match = array();
foreach ($data_array as $k => $char) {
foreach ($whitelist as $w) {
if (!isset($match[$k])) {
if ($char === $w) {
$match[$k] = true;
}
}
}
if (!isset($match[$k]) || $match[$k] !== true) {
$invalids[$k] = 'Invalid character at position '.$k.'.';
}
}
答案 3 :(得分:0)
更新:添加$ type = gettype ... settype($ char,$ type)以允许===在检查整数时正常运行
foreach ($data_array as $k => $char) {
foreach ($whitelist as $w) {
if (!isset($match[$k])) {
$type = gettype($w);
if (gettype($char) !== $type) {
settype($char, $type);
}
if ($char === $w) {
$match[$k] = true;
}
}
}
...