PHP - 清理逗号分隔的字符串

时间:2009-11-17 16:25:34

标签: php csv user-input sanitization

清除用户输入的最有效方法是完全依赖于数字的逗号分隔字符串 - 例如

  

2,40,23,11,55

我在很多输入上使用此功能

function clean($input){ $input=mysql_real_escape_string(htmlentities($input,ENT_QUOTES)); return $input; }

在简单的整数上我做了:

if (!filter_var($_POST['var'], FILTER_VALIDATE_INT)) {echo('error - bla bla'); exit;}

那么我应该将它爆炸然后用上面的代码检查数组的每个元素,或者用''替换所有出现的','然后检查整个事情是一个数字?你们觉得怎么样?

4 个答案:

答案 0 :(得分:3)

if (ctype_digit(str_replace(",", "", $input))) {
  //all ok. very strict. input can only contain numbers and commas. not even spaces
} else {
  //not ok
}

如果是CSV并且数字或逗号周围可能有空格,甚至某些引号可以更好地使用正则表达式来检查它是否匹配

答案 1 :(得分:2)

if (!preg_match('/\A\d+(,\d+)*\z/', $input)) die('bad input');

答案 2 :(得分:0)

如果你想要转换逗号分隔的列表而不是简单地拒绝它,如果它没有正确形成,你可以用array_map()来做,并避免编写显式循环。

$sanitized_input = implode(",", array_map("intval", explode(",", $input)));

答案 3 :(得分:0)

我会过滤而不是对简单输入进行错误检查,尽管只是因为我懒惰,我想,并且通常在网络环境中有太多的情况来处理可能会发生的事情我不会expect:下面简单的过滤器。

<?php
$input = '234kljsalkdfj234a,a, asldkfja 345345sd,f jasld,f234l2342323@#$@#';
function clean($dirty){ // Essentially allows numbers and commas, just strips everything else.
    return preg_replace('/[^0-9,]/', "", (string) $dirty);
}

$clean = clean($input);

echo $clean;
// Result: 234234,,345345,,2342342323
// Note how it doesn't deal with adjacent filtered-to-empty commas, though you could handle those in the explode.  *shrugs*

&GT;

这是代码板上的代码和输出:

http://codepad.org/YfSenm9k