2013-01-08 37 views
2

我運行一個包含數百萬用戶生成的帖子,包含HTML的大型網站。其中一些帖子包含我廣告客戶不想在旁邊做廣告的敏感詞。我不想刪除這些帖子,而是審查「壞」字。我還需要保留標記,因爲讓用戶標記他們的帖子是該網站的主要功能。檢查可能包含標記的不適當單詞的最佳方法是什麼?

我目前正在使用搜索並用str_ireplace()替換,但我們的作者已經變得聰明並且正在做一些事情(下文),這些事情都會通過我的原始過濾器。我可以去掉標籤,檢測到這個不恰當的單詞,但我正在尋找一種替換單詞的方式,同時保持標記不變。

例子:

成功審查:

input: "<p>Mary is a bitch.</p>" 
output: "<p>Mary is a *****.</p>" 

未成功審查:

input:   "<p>Mary is a <strong>b</strong>itch.</p>" 
failed output: "<p>Mary is a <strong>b</strong>itch.</p>" 
desired output: "<p>Mary is a <strong>*</strong>****.</p>" 
+5

我不認爲這會有所幫助。如何b-itch,b * i * t * c * h,beetch,be-yatch等,令人生厭。這是一個連續的戰鬥,你添加規則,他們找到解決方法。 – SWeko

+0

@SWeko - 我有我的單詞列表 - 問題是,有些作者正在做的事情像b ee tch其中有無限的可能性。 – Vidbot

+0

首先,擺脫消息中的html。如果有的話,確實沒有辦法可靠地審查你的文本。然後,去掉所有非字母字符,然後將您的結果與所有可能發誓的大量圖書館進行比較。祝你好運。 – Cerbrus

回答

1

只是爲了好玩這裏是一個快速和骯髒的方式:

$badWords = array('bitch', 'jerk'); 
$input = '<p>Mary is a <strong>b</strong>itch. </p>'; 

$arr = explode(' ', $input); 

foreach($arr as $key => $word) 
{ 
    $word = str_replace('.', '', strip_tags($word)); 
    if(in_array($word, $badWords)) 
    { 
     $arr[$key] = '*****'; 
    } 
} 

$output = implode(' ', $arr); 
echo $output; 

輸出

<p>Mary is a ***** </p> 

上面的內容將文本分割爲文字,並在每個單詞上應用strip_tags(),以便它不影響整個內容。

儘管如此,正如評論指出的那樣,仍然有很多方法。你永遠不會得到一個完美的解決方案,可以處理他們所投的一切 - 你需要創造一些接近人工智能的東西。我認爲最好的解決方案是在整個帖子上搜索strip_tags()並搜索不好的單詞,然後如果發現任何問題,請將帖子標記爲版主注意。或者只是簡單地使用活動版主的報告發布系統。

+0

這個問題已經成爲時間敏感,所以我想我將不得不做大規模搜索並標記所有包含不良詞彙的帖子,並讓mods處理他們。 – Vidbot

+0

@Vidbot然後,你應該發表這個評論作爲答案,並接受它自己。 –

2

我的建議是使用其他方法來阻止這一點,因爲這是非常困難的。

this amusing piece by Jeff Atwood約從試圖這樣做會出現「clbuttic」的問題是什麼:

淫穢內容過濾是一個持久的,甚至是永恆的問題。我懷疑只能通過代碼解決這個問題是不可能的。但似乎有些公司和開發商不能停止在那個風車上傾斜。這意味着在你前往斯肯索普之前,你可能會想三次。

+1

我目前有幾個mods標記和刪除帖子,但可能需要找到更容易冒犯的​​mod,以便與Google廣告網絡的觀點保持一致。 – Vidbot

+0

哈哈,'更容易冒犯的​​mods'..不錯:) :) – Nanne

0

你可以從一個「髒話」列表啓動,並檢查代碼清潔串(即,通過strip_tags()反對「壞詞」過濾。 然後,你可以通過一系列可能的迭代每個壞字單字母的改變,如S=>5, 1=>L, 0=>O

0

您將有一個非常艱難的時間來完成這個任務,但我的建議是不要用星號來改變這些單詞,而只是拒絕發佈並讓用戶知道原因。原因如下:

  1. 簡化您的搜索。如果你的算法只需要檢查文本中是否存在某種形式的壞詞,那麼你可以在strip_tags文本中搜索你的文字。如果您試圖用星號代替它,則不能使用strip_tags,因爲您需要將原始文本保留在先前的狀態。
  2. 這是人們的期望。什麼人不要期望是他們的文本被修改而不通知他們。你可能會更好地發送人回覆「這個帖子包含不適當的單詞/文字」

如果你堅持用星號代替而不是發回用戶,你需要編寫一個基本的字符逐字符解析器,忽略HTML標籤並從中構造出單詞。

相關問題