2009-11-17 3 views
2

Что будет наиболее эффективным способом очистки пользовательского ввода, который через запятую строка сделана полностью на номера - например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;} 

Так что я должен взорвать его, а затем проверить каждый элемент массива с помощью кода выше или, возможно, заменить все вхождения ',' на '', а затем проверить, что все это число? Ребята, что вы думаете?

+0

Оба ответа работают удовольствие, спасибо. Я тестировал их, хотя ответ дрожания примерно в 4 раза эффективнее. +1 вас обоих. – Mark

ответ

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, и если там могут быть пробелы вокруг цифр или запятыми и, возможно, даже некоторые кавычки лучше использовать регулярное выражение, чтобы проверить, соответствует ли это

+0

Возможно, вы захотите также удалить пустое пространство - в зависимости от того, с чем связано «csv». – micahwittman

+0

Спасибо, не заметил тег csv – jitter

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

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

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

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

+0

Да, хорошая точка. –

0

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

<?php 
$input = '234kljsalkdfj234a,a, asldkfja 345345sd,f jasld,[email protected]#[email protected]#'; 
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* 

>

Вот код и выход на codepad:

http://codepad.org/YfSenm9k