检查字符串是否是以逗号分隔的数字列表

时间:2015-07-25 14:08:44

标签: php mysql string

在我的table1中我有varchar字段,其中我存储了另一个table2的id-list(id-INT UNSIGNED AUTOINCREMENT),用逗号分隔。

例如:1,3,5,12,90

也不应重复ID。

我需要检查字符串(来自外部)是否符合此规则。 例如,我需要检查$ _POST [' id_list']

数据一致性现在并不重要(例如,插入此值而不检查table2中是否存在此ID)

任何建议都会有所帮助。

3 个答案:

答案 0 :(得分:10)

进行此类检查的最简单方法是使用正则表达式(preg_match)。 让我们尝试找到符合我们规则的模式。

以逗号分隔的数字:

^[0-9]+(,[0-9]*)*$ 

^ - 表示字符串的开头。 $ - 表示字符串结束。 [0-9]+ - 表示我们的字符串必须以数字开头。 (,[0-9]+)* - 表示我们的字符串CAN继续使用",$ someDigits"方式,从0到你想要的次数。

但如果我们的数字是" INT UNSIGNED AUTOINCREMENT"我们应该这样修改我们的模式:

^[1-9][0-9]*(,[1-9][0-9]+)*$

排除类似的情况:0,01,02,009,000,012

对于唯一值,我认为更清楚的是使用逗号分割(explode)字符串到数组,传递给array_unique并进行比较。

结果检查功能将是:

function isComaSeparatedIds($string, $allowEmpty = false) {
    if ($allowEmpty AND $string === '') {
        return true;
    }
    if (!preg_match('#^[1-9][0-9]*(,[1-9][0-9]*)*$#', $string)) {
        return false;
    }
    $idsArray = explode(',', $string);
    return count($idsArray) == count(array_unique($idsArray));
}

如果你想允许空字符串,还添加了$ allowEmpty参数。

答案 1 :(得分:0)

这是一个有点厚颜无耻的解决方案,但确实可以做到。

<?php

$a="1,3,5,12,90";
$b=explode(",",$a);
$str='';

for($c=0;$c<count($b);$c++)
{
    if (preg_match('/^[0-9]+$/', $b[$c])) 
    {
        $str=$str."Y";
    }
}

if(count(array_unique($b))==count($b)  && (count($b)==strlen($str)))
{
   echo $str;
    //FURTHER CODE HERE WHEN ALL ELEMENTS UNIQUE AND VALID NUMBERS
}
else
{
    //FURTHER CODE HERE WHEN NOT UNIQUE OR NOT A VALID NUMBERS
}
?>

答案 2 :(得分:0)

出于完整性考虑,我想提以下解决方案:

<?php

$check = explode(',', $string);
if ($diff = array_diff_key($check, array_filter($check, 'ctype_digit'))) {
    // at least one is not a digit
    foreach ($diff as $failIndex => $failValue) {
        // handle
    }
}

对于字符串中少于1000个数字,这比preg_match快一点,并且获得的额外位数和位数也不是什么。