上代码:
<?php
function cleanQueryWord($word)
{
$src = array('+', '-', '&', '|', '!', '(', ')', '{', '}', '[', ']', '^', '"', '~', '*', '?', ':');
$dst = array('\+','\-','\&','\|','\!','\(','\)','\{','\}','\[','\]','\^','\"','\~','\*','\?','\:');
$word = str_replace($src, $dst, $word);
$word = str_replace('\\\\', '\\', $word);
return $word;
}
var_dump(cleanQueryWord('!!-sb gameboy90!!@'));
?>
str_replace中的前两个参数,$search和$replace的类型,都是mixed,而不是string!So,在设置替换规则时,你要注意。
Description
This function returns a string or an array with all occurrences of search in subject replaced with the given replace value.
上面代码中的 $word = str_replace($src, $dst, $word);
如果我们这里设置$word='!!-sb gameboy90!!@';
运行之后出来的结果是: string(28) "\\!\\!\\-sb gameboy90\\!\\!@"
这里,犹如三国杀里的锦囊“无懈可击”一样,它是可以被反无懈的,但是 \\\\ 和 \\ 的效果和反无懈可击又不是特别一样,\【\】\【\】这里用【】包起来的是被注释的,它的意思是在向编译器解释说,我(\【\】)是一个普通的符号,不想注释别人(其实可以理解为这张无懈可击我是当做普通的一张牌打出,并不是使用它的锦囊效果!);所以\\\\实际上就是两个普通的符号(\\)。
至此,不是特别迷惑了吧??!!