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*
?>
Вот код и вывод на кодовую панель: