在我的table1中我有varchar字段,其中我存储了另一个table2的id-list(id-INT UNSIGNED AUTOINCREMENT),用逗号分隔。
例如:1,3,5,12,90
也不应重复ID。
我需要检查字符串(来自外部)是否符合此规则。 例如,我需要检查$ _POST [' id_list']
数据一致性现在并不重要(例如,插入此值而不检查table2中是否存在此ID)
任何建议都会有所帮助。
答案 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快一点,并且获得的额外位数和位数也不是什么。