比如,某人提交的評論的形式在我的網站與該PHP如何驗證包含gobbeldy goop的字符串?
jfaeioafjifuhdafiuafhiuahfeiheuih487qt4h78tq3ht48ihi7a3vvt4hatfja7c4hat4tyhit4ht4ihgkuagebeyhkughukaghkuagrhagkhrkugr
這顯然是一個垃圾評論認爲不應該允許發佈。
但是,PHP如何知道這是垃圾評論?
如何使用PHP檢測像這樣的垃圾字符串?
比如,某人提交的評論的形式在我的網站與該PHP如何驗證包含gobbeldy goop的字符串?
jfaeioafjifuhdafiuafhiuahfeiheuih487qt4h78tq3ht48ihi7a3vvt4hatfja7c4hat4tyhit4ht4ihgkuagebeyhkughukaghkuagrhagkhrkugr
這顯然是一個垃圾評論認爲不應該允許發佈。
但是,PHP如何知道這是垃圾評論?
如何使用PHP檢測像這樣的垃圾字符串?
正確的答案几乎肯定是「它不能可靠地完成」。但是,如果您想至少嘗試一下,您可以從以下內容中獲得靈感 - 將字符串拆分爲單個單詞(刪除標點符號和空格),然後根據預期單詞列表測試每個單詞;並接受評論如果至少一個頻繁的詞存在:
<?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 ),然後查看其中至少有一個是否在測試字符串中。實際上,您可能想要增加列表(可能基於您網站上有效評論的頻率列表),然後測試您是否「獲得了至少一定比例的已知單詞」。這是一個比「只要我看到詞典中的詞我接受評論」更敏感(而且合理)的測試。
* @Floris對,請參閱Aglutinational Aqualividness。* - 這聽起來像是在論壇主題中的一個非常好的評論(雖然在這裏作出了效果),並且不會通過您的測試。試圖說,在實踐中,通過意圖和「意義」進行過濾幾乎是不可能的,特別是只用幾行簡短的PHP。 – deceze
您必須先聲明術語「垃圾評論」的定義,然後我們才能幫助您實施它。 – Cthulhu
您是否期望所有評論都是英文的?你可以測試幾乎任何評論中出現的一些明顯的「單詞」:「the,be,to,of,and,...,」 - 見http://en.wikipedia.org/wiki/Most_common_words_in_English一個好的清單。沒有任何前20個單詞的評論是「有效」的機會可能非常渺茫。 – Floris
@弗洛伊什麼這將是一個很好的方法來檢查這些字詞的字符串? – user3096443