2011-03-18 94 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'; 
} 
} 
相關問題