Я очищаю ввод в форме. В некоторых случаях я удаляю ненужные символы, а другие заменяют их другим.
Символы для удаления включают: &() + <>? ~ Я пробовал пару вещей:
function clean($data) {
$data = strip_tags(trim($data));
$replace = array('','~'!@#$%^*/'); // not: & () + <> ? = []
$data = str_replace($replace, '', $data);
$data = str_replace ("~","", $data);
$data = str_replace ("=", '', $data);
$data = str_replace ('(',"", $data);
$data = str_replace (')',"", $data);
$data = str_replace (" ","-", $data);
$data = ltrim($data, "-");
$data = rtrim($data, "-");
return $data;
}
Символы: ~ =() вызывают сбой замены массива, поэтому я добавил дополнительные конкретные замены, например:
$data = str_replace ("~","", $data);
Это успешно преобразует вход:
~~~ hi there == ---() @# ~! @& {} $% + =\^ []/\//= +) (& ^%! @# $% ^ & * ~~
чтобы:
всем привет
который кажется хорошим. Я попробовал кучу вариантов, в том числе escaping() в списке массивов, чтобы попытаться заставить его работать самостоятельно, но без кубиков. Лучшее решение?
Чтобы str_replace работал с массивом, каждый символ должен быть его собственным значением.
Пример:
<?php
$search = array('~',''','!','@','#','$','%','^','*','/','(',')','=','&','{','}','+','-','[',']','\\');
$replace = array('', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '');
$targetString = '~~~ hi there== ---()@#~!@&{}$%+=\^[]/\//=+)(&^%!@#$%^&*~~';
$newString = str_replace($search, $replace, $targetString);
var_dump($newString);
http://codepad.viper-7.com/LxNAOX
Таким образом, каждое значение в $search
имеет соответствующее значение в $replace
. $search[0]
идет с $replace[0]
, $search[6]
с помощью $replace[6]
... и далее и далее. У меня есть значения замены как все пустые строки, но вы можете поместить любую строку там, которую хотите заменить, и они не все должны быть одинаковыми, если хотите.
Хотя, в зависимости от того, что вы делаете, лучше использовать регулярное выражение. Регулярное выражение позволит вам создать белый список символов вместо черного списка. Вместо перечисления каждого персонажа, которого вы не хотите разрешать и постоянно добавляете, когда кто-то решает использовать символы верхнего ascii (ðñòóôõ
... и т.д.), Вы можете использовать что-то вроде этого, чтобы допускать только буквы, цифры и пробелы:
<?php
$targetString = '~~~ hi there== ---()@#~!@&{}$%+=\^[]/\//=+)(&^%!@#$%^&*~~';
$newString = preg_replace('/[^a-z0-9 ]+/i', '', $targetString);
var_dump($newString);
Это, по сути, означает удаление любых символов, которые не относятся a to z
, от 0 to 9
или пробелу.
Кажется, что вы хотите санировать практически любые персонажи, но вы не говорите, почему, так что вам действительно нужно, трудно понять!
Как говорит Джонатан, часто намного лучше использовать белый список, и для этого (и многое другое) регулярные выражения велики.
У регулярных выражений есть метасимволы, они могут соответствовать всем необходимым. Метасимволы используются для экранирования обычного символа.
'/\w/'
соответствует любому символу слова независимо от языка, а capital '/\W/'
делает обратное.
Я нашел этот комментарий в руководстве PHP, полезный для справки: http://php.net/manual/en/function.preg-match.php#105924
az
для представления всех букв отa to z
). Там может быть какой-то шаблон, который вы можете найти, который будет включать несколько групп символов.