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

2 php mysql string

在我的table1中我有varchar字段,其中我存储其他table2的id-list(id-INT UNSIGNED AUTOINCREMENT),用逗号分隔.

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

也不应该重复ID.

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

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

任何建议都会有所帮助.

M0r*_*iis 10

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

只是以逗号分隔的数字:

^[0-9]+(,[0-9]*)*$ 
Run Code Online (Sandbox Code Playgroud)

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

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

^[1-9][0-9]*(,[1-9][0-9]+)*$
Run Code Online (Sandbox Code Playgroud)

排除案例如:0,01,02,009,000,012

至于唯一值,我认为更清楚的是使用逗号分割(爆炸)字符串到数组,通过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));
}
Run Code Online (Sandbox Code Playgroud)

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