我正在清理表格中的一些输入。在某些情况下,我将删除不需要的字符,而在其他情况下,将其替换为另一个字符。
要删除的字符包括:& ()+<> ? 〜 我尝试了几件事:
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(),试图让它自己工作,但没有骰子。更好的解决方案?
答案 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