PHP - очистить строку через запятую

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

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 ответа

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

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

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

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

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

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

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

Другие вопросы по тегам