2013-12-12 66 views
0

比如,某人提交的評論的形式在我的網站與該PHP如何驗證包含gobbeldy goop的字符串?

jfaeioafjifuhdafiuafhiuahfeiheuih487qt4h78tq3ht48ihi7a3vvt4hatfja7c4hat4tyhit4ht4ihgkuagebeyhkughukaghkuagrhagkhrkugr

這顯然是一個垃圾評論認爲不應該允許發佈。
但是,PHP如何知道這是垃圾評論?
如何使用PHP檢測像這樣的垃圾字符串?

+1

您必須先聲明術語「垃圾評論」的定義,然後我們才能幫助您實施它。 – Cthulhu

+1

您是否期望所有評論都是英文的?你可以測試幾乎任何評論中出現的一些明顯的「單詞」:「the,be,to,of,and,...,」 - 見http://en.wikipedia.org/wiki/Most_common_words_in_English一個好的清單。沒有任何前20個單詞的評論是「有效」的機會可能非常渺茫。 – Floris

+0

@弗洛伊什麼這將是一個很好的方法來檢查這些字詞的字符串? – user3096443

回答

0

正確的答案几乎肯定是「它不能可靠地完成」。但是,如果您想至少嘗試一下,您可以從以下內容中獲得靈感 - 將字符串拆分爲單個單詞(刪除標點符號和空格),然後根據預期單詞列表測試每個單詞;並接受評論如果至少一個頻繁的詞存在:

<?php 
$goodString = "This is a valid,comment with lots of known words"; 
$badString = "gobbledigook yuk yuk yakkety yak"; 
$goodList = array('the','be','to','of','is','he','she','are','in','that','it','have','for','not','on','with','as','you','do','at'); 

foreach(array($goodString, $badString) as $testString) { 
    $goodCount = 0; 
    $splitString = preg_split("/\b/", $testString); 
    $testArray = array_filter($splitString, create_function('$a','return preg_match("/^[A-Za-z]+$/", $a);')); 
    foreach($goodList as $word) { 
    if (in_array($word, $testArray) !== FALSE) { 
     $goodCount = $goodCount + 1; 
    } 
    } 

    if($goodCount > 0) { 
    echo "'".$goodString."' is a reasonable string\n"; 
    } 
    else { 
    echo "'".$testString."' does not have any of the test words in it\n"; 
    } 
} 
?> 

我挑選「短頻繁出現的詞彙」(來源:http://en.wikipedia.org/wiki/Most_common_words_in_English)(I離開的「I」和「a」,儘管它們在頂端20 ),然後查看其中至少有一個是否在測試字符串中。實際上,您可能想要增加列表(可能基於您網站上有效評論的頻率列表),然後測試您是否「獲得了至少一定比例的已知單詞」。這是一個比「只要我看到詞典中的詞我接受評論」更敏感(而且合理)的測試。

+1

* @Floris對,請參閱Aglutinational Aqualividness。* - 這聽起來像是在論壇主題中的一個非常好的評論(雖然在這裏作出了效果),並且不會通過您的測試。試圖說,在實踐中,通過意圖和「意義」進行過濾幾乎是不可能的,特別是只用幾行簡短的PHP。 – deceze