1

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.

4

2 回答 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 回答