2011-03-18 104 views
1

我有一个简单的数组搜索我正在用php做。为什么这个数组搜索不适合我?

$qs = 'something$'; 

// check if string has bad characters... 
$bad_chars = array('$',',',' ','?','=','&','-','|','@','#','%','^','*','(',')','{','}','|','\\','[',']','/','`','~'); 

if(in_array($qs,$bad_chars)) { 
    echo 'bad characters'; 
} 

对我来说,这应该回应'坏字符',但它不。

我缺少什么?

+0

如果有答案的帮你解决你的问题,你应该将其标记为“已接受” /给予好评的。 – 2011-03-20 19:49:39

回答

1

UPDATE:benchmark,比较4个答案与代码:

100000迭代过test_bad_charachters功能,无输出:

Jason's answerfor/str/in_array):32秒
Mike Lewis' answerforeach/str_split/in_array):23秒
Gaurav's answerarray_intersect/!=):8秒
my answer():4秒

更新结束

作为其他的答案指出,in_array($qs, $bad_chars)并不测试如果字符$qs是在$bad_chars,但整个字符串$qs(这显然不是)。要获得预期的结果,您必须测试$qs的单个字符。

这里是应该这样做快速的解决方案:

<?php 
$qs = 'something$'; 

// bad characters 
$bad_chars = array('$',',',' ','?','=','&','-','|','@','#','%','^','*','(',')','{','}','|','\\','[',']','/','`','~'); 

// replace all bad characters in $qs with \00. if the resulting string 
// differs from the original string, it has bad characters. 
// using a single call to str_replace should make this faster than all 
// other suggested solutions - see the benchmark in the UPDATE. 
if (str_replace($bad_chars, '\0', $qs) == $qs) { 
    echo 'bad characters'; 
} 
+0

有趣的解决方案...你用什么来衡量速度? – Jason 2011-03-19 02:06:56

+0

@Jason我做了一个基本的基准测试脚本:1)将函数f1() - f4(),2)写入外部for循环,$ i = 1-4; 3)在该循环内,$ start_time = time(); $ f =“f $ i”; 4)编写一个内循环,$ j = 1-100000; 5)在内部循环中,通过$ f()调用$ i'th函数; 6)在100000次迭代之后,当前函数使用的时间是time() - $ start_time;打印它; 7)对剩余的test_bad_character实现执行相同操作。如果你有兴趣,我可以把代码放在某个地方。 – 2011-03-19 05:36:07

+0

是的,我想看看它。听起来像是一个很好的工具。 – Jason 2011-03-21 04:47:23

0

这是因为它看到“something $”是否是$ bad_chars中的一个元素,事实并非如此。

编辑:

解决方案:

<?php 
$qs = 'something$'; 

// check if string has bad characters... 
$bad_chars = array('$',',',' ','?','=','&','-','|','@','#','%','^','*','(',')','{','}','|','\\','[',']','/','`','~'); 

foreach(str_split($qs) as $char){ 

    if(in_array($char, $bad_chars)){ 

    echo $char. " was bad char"; 
    } 
} 

?> 
+0

例如你需要分解qs,看看它包含的每个字符是否与任何一个bad_chars匹配 – 2011-03-18 04:58:51

+0

你可以使用'str_split($ qs)'将一个字符串拆分为一个字符数组。 – Matthew 2011-03-18 05:39:19

+0

编辑,谢谢konforce。 – 2011-03-18 05:40:25

1
$array = str_split($qs); 

if(array_intersect($array, $bad_chars) != array()) 
{ 
    echo 'bad characters'; 
} 
0

只看每个字母而不是单词作为一个整体。

$qs = 'something$'; 

$bad_chars = array('$',',',' ','?','=','&','-','|','@','#','%','^','*','(',')','{','}','|','\\','[',']','/','`','~'); 

for($i=0; $i < strlen($qs); $i++) { 
// check if string has bad characters... 
if(in_array($qs[$i],$bad_chars)) { 
    echo 'bad characters'; 
} 
} 
相关问题