PHP - очистить строку через запятую - PullRequest
2 голосов
/ 17 ноября 2009

Какой самый эффективный способ очистить пользовательский ввод, представляющий собой строку через запятую, состоящую исключительно из чисел - например,

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 ]

3 голосов
/ 17 ноября 2009
if (ctype_digit(str_replace(",", "", $input))) {
  //all ok. very strict. input can only contain numbers and commas. not even spaces
} else {
  //not ok
}

Если это CSV и если между цифрами или запятыми могут быть пробелы и, возможно, даже некоторые кавычки, лучше использовать регулярное выражение, чтобы проверить, соответствует ли оно

2 голосов
/ 17 ноября 2009
if (!preg_match('/\A\d+(,\d+)*\z/', $input)) die('bad input');
0 голосов
/ 17 ноября 2009

Я бы фильтровал вместо проверки ошибок при простом вводе, хотя бы потому, что я ленив, я полагаю, и обычно в веб-контексте слишком много случаев, чтобы обработать то, что может произойти, что я бы не стал ожидать: простой фильтр ниже.

<?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*

?>

Вот код и вывод на кодовую панель:

http://codepad.org/YfSenm9k

0 голосов
/ 17 ноября 2009

Если вы хотите преобразовать разделенный запятыми список, а не просто отклонить его, если он сформирован неправильно, вы можете сделать это с помощью array_map() и избежать написания явного цикла.

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