你如何删除〜,?,<>,类似

时间:2015-02-17 17:50:14

标签: php

我正在清理表格中的一些输入。在某些情况下,我将删除不需要的字符,而在其他情况下,将其替换为另一个字符。

要删除的字符包括:& ()+<> ? 〜 我尝试了几件事:

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);

这成功转换了输入:

~~~你好== ---()@#〜!@&amp; {} $%+ = \ ^ [] / \ // = +)(&amp; ^ %!@#$%^&放大器; * ~~

到:

HI-有

这似乎很好。我尝试了一些变体,包括数组列表中的escaping(),试图让它自己工作,但没有骰子。更好的解决方案?

2 个答案:

答案 0 :(得分: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,{{1}}或空格的字符。

答案 1 :(得分:0)

看起来你想要消毒任何特殊角色,但你不能说出原因,所以你真正需要的东西很难弄明白!

正如乔纳森所说,做白名单方法通常要好得多,为此(以及许多其他方面),正则表达式很棒。

正则表达式有一个叫做元字符的东西,它们可以匹配你需要的任何东西。通过转义其他正常字符来使用元字符。

无论语言如何,

'/\w/'都匹配任何单词字符,而'/\W/'则相反。

我在PHP手册中发现了这个特别注释,可供参考:http://php.net/manual/en/function.preg-match.php#105924