I have a string. I should generate a sql text. Can I determine datatype using regexp. For examle : 15.04.2013 or 2013/04/15 or 15/04/2013 is date. 15 , 46 is integer / int 1 or 0 is boolean ... etc.
问问题
152 次
2 回答
2
使用gettype()和strtotime(),以下函数检查它是布尔值、整数、浮点数还是日期:
function get_type($input){
$type = gettype($input);
if($type == 'string'){
if(filter_var($input, FILTER_VALIDATE_INT) !== false){
return 'integer';
}elseif(filter_var($input, FILTER_VALIDATE_FLOAT) !== false){
return 'float';
}elseif(filter_var($input, FILTER_VALIDATE_BOOLEAN) !== false){
return 'boolean';
}elseif(strtotime($input) !== false){
return 'date';
}
}elseif($type == 'double'){
return 'float';
}
return $type;
}
输入:
echo '0 : <b>'.get_type(0).'</b><br>';
echo '1 : <b>'.get_type(1).'</b><br>';
echo '1.11 : <b>'.get_type(1.11).'</b><br>';
echo '1.2e3 : <b>'.get_type(1.2e3).'</b><br>';
echo 'true : <b>'.get_type(true).'</b><br>';
echo 'false : <b>'.get_type(false).'</b><br>';
echo '\'wut\' : <b>'.get_type('wut').'</b><br>';
echo 'array() : <b>'.get_type(array()).'</b><br>';
echo '\'TRUE\' : <b>'.get_type('TRUE').'</b><br>';
echo '\'false\' : <b>'.get_type('TRUE').'</b><br>';
echo '\'0\' : <b>'.get_type('0').'</b><br>';
echo '\'1\' : <b>'.get_type('1').'</b><br>';
echo '\'15.04.2013\' : <b>'.get_type('15.04.2013').'</b><br>';
echo '\'15 april 2013\' : <b>'.get_type('15 april 2013').'</b><br>';
echo '\'+7 days\' : <b>'.get_type('+7 days').'</b><br>'; // fail in a way
echo '\'15/04/2013\' : <b>'.get_type('15/04/2013').'</b><br>'; // fail
echo '\'25-10-2013 wut\' : <b>'.get_type('25-10-2013 wut').'</b><br>';
echo '\'500\' : <b>'.get_type('500').'</b><br>';
echo '\'54.360\' : <b>'.get_type('54.360').'</b><br>';
echo '\'+54.360\' : <b>'.get_type('+54.360').'</b><br>';
echo '\'1.2e3\' : <b>'.get_type('1.2e3').'</b><br>';
echo '\'7E-10\' : <b>'.get_type('7E-10').'</b><br>';
输出:
0 : integer
1 : integer
1.11 : float
1.2e3 : float
true : boolean
false : boolean
'wut' : string
array() : array
'TRUE' : boolean
'false' : boolean
'0' : integer
'1' : integer
'15.04.2013' : date
'15 april 2013' : date
'+7 days' : date
'15/04/2013' : string
'25-10-2013 wut' : string
'500' : integer
'54.360' : float
'+54.360' : float
'1.2e3' : float
'7E-10' : float
于 2013-04-15T14:19:00.907 回答
1
这是一个简单而愚蠢的检查器......但我不得不提到你不能确定日期和月份......(对于<13天)......
$s = '01/04/2013';
if (($s=='0') || ($s=='1') || ($s=='true') || ($s=='false')) return('boolean');
if ((string)intval($s) == $s) return('integer');
if (intval($s).'TL' == $s) return('currency');
if ((string)parseFloat($s) == $s) return('float');
$a = explode('.', $s);
if (count($a) != 3) $a = explode('/', $s);
if (count($a) != 3) return('I do not know');
在这里您必须填写检查$a
...的每个成员
$a[0]
, $a[1]
, 并且$a[2]
应该包含日期元素,所以你检查它们......
请注意,月份可能是“Nisan”、“Mayıs”、“Haziran”之类的文本
如果它们是有效的返回:
return('date');
于 2013-04-15T13:49:11.290 回答