Как удалить ~,?, <>, Аналогичные

0

Я очищаю ввод в форме. В некоторых случаях я удаляю ненужные символы, а другие заменяют их другим.

Символы для удаления включают: &() + <>? ~ Я пробовал пару вещей:

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() в списке массивов, чтобы попытаться заставить его работать самостоятельно, но без кубиков. Лучшее решение?

Теги:

2 ответа

1

Чтобы 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 или пробелу.

  • 0
    Белый список имеет некоторый смысл, за исключением того, что я думаю, что ваши данные многоязычны. Есть ли многоязычный подход?
  • 0
    Зависит от того, что вы хотите сделать с многоязычными персонажами. С белым списком обычно вы должны перечислить все символы, которые вы хотите разрешить, включая другие языки. Однако регулярные выражения допускают шаблоны (например, az для представления всех букв от a to z ). Там может быть какой-то шаблон, который вы можете найти, который будет включать несколько групп символов.
Показать ещё 1 комментарий
0

Кажется, что вы хотите санировать практически любые персонажи, но вы не говорите, почему, так что вам действительно нужно, трудно понять!

Как говорит Джонатан, часто намного лучше использовать белый список, и для этого (и многое другое) регулярные выражения велики.

У регулярных выражений есть метасимволы, они могут соответствовать всем необходимым. Метасимволы используются для экранирования обычного символа.

'/\w/' соответствует любому символу слова независимо от языка, а capital '/\W/' делает обратное.

Я нашел этот комментарий в руководстве PHP, полезный для справки: http://php.net/manual/en/function.preg-match.php#105924

Ещё вопросы

Сообщество Overcoder
Наверх
Меню