2013-08-21 114 views
4

我用下面的代碼來代替進攻words-如何通過php刪除帖子中的冒犯性詞語?

$text = str_replace("f***","(Offensive words detected & removed!)",$text); 

此代碼將取代「他媽的」到「(不文明字詞檢測&刪除!)」。

但問題是「案例」,如果有人輸入FUCK我的代碼無法檢測到它。如何解決它?

+1

使用'的preg_replace( 「#字#我」,$替換,​​$文本);' – 2013-08-21 07:41:02

+6

不實行黑名單/白名單。如果你開始用'butt'替換'ass',你會最終得到像'buttbuttinate'這樣的東西。 – Blender

+3

A [clbuttic](http://www.codinghorror.com/blog/2008/10/obscenity-filters-bad-idea-or-incredibly-intercoursing-bad-idea.html)試圖做到不可能的情況。 – deceze

回答

0

使用str_ireplace功能str_replace函數的不區分大小寫版本()

$text = str_ireplace("flip","(Offensive words detected & removed!)", $text); 
+2

爲什麼一個提供消除冒犯性詞語的帖子本身就具有冒犯性的詞語? –

+2

@ØHankyPankyØ您如何證明其效果?如果你把'f ***'放在那裏,未來的用戶怎麼知道它不是字面的'f ***'? –

+0

@ØHankyPankyØ哦,來吧,真的嗎?你的編輯破壞了代碼。 – deceze

1

其他的答案和評論說,編程是不是最好的解決這個問題。我同意他們。這些答案應該移至Moderators - Stack ExchangeWebmasters - Stack Exchange

由於這是計算器,我的答案將基於計算機編程。

如果您想使用str_replace,請執行如下操作。 爲了這篇文章,因爲有些人被實際的口令冒犯了,讓我們假裝這些是壞詞: 'fug','schnitt','dam'。

$text = str_ireplace(" fug ","(Offensive words detected & removed!)",$text); 

注意,這不是str_ireplacestr_replacei用於「不區分大小寫」。 但是,這將錯誤地匹配「fuggedaboudit」,例如。

如果你想做一個更可靠的工作,你需要使用正則表達式。

$bad_text = "Fug dis schnitt, because a schnitter never dam wins a fuggin schnitting darn"; 
$hit_words = array("fug","schnitt","dam"); // these words are 'hits' that we need to replace. hit words... 
array_walk($hit_words, function(&$value, $key) { // this prepares the regex, requires PHP 5.3+ I think. 
    $value = '~\b' . preg_quote($value ,'~') . '\b~i'; // \b means word boundary, like space, line-break, period, dash, and many others. Prevends "refudgee" from being matched when searching for "fudge" 
}); 

/*print_r($bad_words);*/ 
$good_words = array("fudge","shoot","dang"); 

$good_text = preg_replace($hit_words,$good_words,$bad_text); // does all search/replace actions at once 

echo '<br />' . $good_text . '<br />'; 

這將一次做所有的搜索/替換。這兩個數組應該包含相同數量的元素,匹配搜索和替換項。它不會匹配單詞的部分,只會匹配整個單詞。當然,堅定的推銷員會找到讓他們對你的網站發誓的方法。但它會阻止偷懶者。

我決定添加一些鏈接到網站,顯然使用編程通過消除褻瀆做第一次運行。當我遇到他們時,我會添加更多。除雅虎之外:

1.)Dell.com - 用<profanity deleted>替換匹配的詞。 http://en.community.dell.com/support-forums/peripherals/f/3529/t/19502072.aspx

2.)超級計算機沃森顯然開發了一個詛咒問題。你如何分辨詛咒和俚語之間的區別?顯然,研究人員決定清除所有這些非常困難。但是他們可能只使用了一串詛咒詞(完全匹配是正則表達式的一個子集,我會說),並禁止使用它們。無論如何,這就是它在現實生活中的作用。 Watson develops a profanity problem

3。

  • 添加你希望每個消息
  • 中搜索「表達式描述內容:對企業使用Apps的Gmail自定義設置)Content Compliance section Expresssions「可以有多種類型,包括」高級內容匹配「,其中包括允許您選擇與您在Excel過濾器中所用內容非常相似的」匹配類型「選項:開始於,結束於,包含,不包含,等於,是空的,所有這些都可能使用正則表達式。但是,等等,還有更多:匹配正則表達式,不匹配正則表達式,匹配任何單詞,匹配所有單詞。因此,強大的Google爲其業務用戶實施了正則表達式過濾選項。爲什麼會這樣做,當正則表達式如此無效時呢?因爲它實際上足夠有效。這是一個簡單,快速的編程解決方案,只有當人們不願意繞過它時纔會失敗。

    除了這個清單,我還想知道其他人是否注意到剔除褻瀆和過濾垃圾郵件之間的相似之處。很明顯,正則表達式在兩個領域都有用處,但是那些通過死記硬背的方式學習過的「所有正則表達式都很糟糕」的挑剔者如果提到正則表達式,總是會對任何問題的回答都下降。 嘗試使用Google搜索「垃圾郵件過濾器的工作方式」。你會得到這樣一個涵蓋垃圾郵件刺客的結果: http://www.seas.upenn.edu/cets/answers/spamblock-filter.html

    另一個我確定使用regex的例子是當通過Amazon.com的亞馬遜市場進行通信時。您收到電子郵件通常在您的電子郵件地址。因此,自然地,在回覆賣家時,您的電子郵件程序將包含各種發件人信息,例如您的電子郵件地址,cc電子郵件地址以及任何您輸入的內容。但是亞馬遜網站將這些內容「去保護」。我能找到解決這個正則表達式的方法嗎?也許,但它會比它的價值更麻煩,因此在一定程度上是有效的。他們還會將電子郵件保留兩年,這大概是爲了讓人們在發生任何欺詐索賠的情況下都可以過關。

    SpamAssassin還會查看消息的主題和正文,以查看消息「看起來像垃圾郵件」時人們注意到的相同類型的事情。它搜索諸如「viagra」,「現在購買」,「最低價格」,「點擊此處」等字符串。它還尋找華麗的HTML,例如大字體,閃爍文本,鮮豔顏色等。

    正則表達式沒有提及,但我確定它正在使用中。

    +0

    這會將'refugee'轉換成'refudgeee'(如果它真的有效)。 –

    +0

    ahh hok,讓我握住你的手,放入字界。 –

    +0

    *警告:preg_replace():參數不匹配,pattern是一個字符串,而替換是一個數組* –

    0

    您應該使用正則表達式替換,並且需要將i標誌添加到您的正則表達式的末尾,以便它搜索您的文本而不管大小寫。所以..

    $text = preg_replace("/fuck/i","(Offensive words detected & removed!)", $text); 
    

    str_ireplace也可以,如果你並不需要複雜的正則表達式規則使用。

    $text = str_ireplace("fuck","(Offensive words detected & removed!)", $text); 
    

    事實上,後者是首選方式,因爲它比正則表達式操作更快。來自PHP文檔:

    如果您不需要更換規則,您通常應該使用此函數而不是preg_replace()和i修飾符。

    但是,正如評論者指出的那樣,如果子要替換顯示爲另一非攻單詞的一部分簡單的字符串/正則表達式替換可以打破你的字符串。爲此,您可以在正則表達式中使用單詞邊界,也可以僅替換不能包含其他字符串的單詞(例如,單詞fuck)。

    +0

    你已經複製了寶來的答案,或者你都從其他地方複製它。無論如何,你不能高興地替換文本中的隨機子字符串:你只會破壞它。 –

    +0

    我還沒有從任何人複製過,我測試過使用'preg_replace'來替換子字符串。在編輯我的答案之前,請確保'str_ireplace'也可以工作 – mavili

    +0

    爲什麼會破壞代碼?你可以解釋嗎? – mavili

    0

    使用「str_ireplace」更換任何區分大小寫字符串 可能的,這將幫助你

    $text = 'contains offensive_word .... so on'; 
    $array = array(
        'offensive_word' => '****', 
        'offensive_word2' => '****', 
        'offensive_word3' => '****', 
    //..... 
    ); 
    $text = str_ireplace(array_keys($array),array_values($array), $text); 
    echo $text; 
    
    +0

    有什麼辦法可以取代「吸」而不是「吸盤」? – netmaster

    +0

    爲什麼選擇投票?你認爲我們這裏的所有人在stackoverflow是朝?幫助像你這樣的人?這不是一個你不喜歡/喜歡任何滿足你需要的問題的地方?去一些網站和學習一些基本的編程? – Shushant

    +0

    @netmaster。是的,通過使用具有單詞邊界的'preg_replace'。看到我的答案。 –

    10

    不管你做什麼,用戶想方設法繞過您的過濾器。他們將使用unicode字符(例如,аss使用西里爾а,並且不會被任何正則表達式解決方案捕獲)。他們會使用空格,美元符號,星號,無論你還沒有設法捕捉到。

    如果家庭友好對於您的申請至關重要,請讓一個人在上線之前審閱內容。否則,請添加標誌功能,以便其他人可以標記令人反感的內容。更好的是,使用某種機器學習或貝葉斯過濾器來自動標記可能令人反感的帖子,並讓人類手動進行檢查。人們比電腦更好地閱讀人類語言。

    +1

    這裏唯一明智的答案。 – deceze

    +0

    @Buttle我沒有任何反對regexen。我有一些反對的解決方案有很多缺點,在實踐中並不奏效。是的,用任何數量的PHP函數替換帶有其他字母的單詞或字母是微不足道的。不,這不會在實踐中形成有效的「壞詞過濾」。 – deceze

    +0

    @deceze然而......然而......嘗試在雅虎新聞文章的回覆中張貼一些「壞詞」,結果如何?顯然,使用正則表達式的人稍微努力總比沒有努力要好。 –

    4

    白名單/黑名單的問題正如其他用戶所指出的那樣,您的用戶將優先考慮在過濾器中尋找滿意的方式,而不是使用您的網站來實現它的目標,無論這可能是什麼。

    一種方法是使用Google爲其「你喜歡什麼?」網站創建的未記錄的褻瀆API。如果您收到true的回覆,則只需向用戶發送一條消息,指出他們的帖子由於檢測到褻瀆而無法提交。

    你可以接近這個如下:

    <?php 
    
    if (isset($_POST['submit'])) { 
        $result = json_decode(file_get_contents(sprintf('http://www.wdyl.com/profanity?q=%s', urlencode($_POST['comments'])))); 
        if ($result->response == true) { 
         // profanity detected 
        } 
        else { 
         // save comments to database as normal 
        } 
    } 
    
    +0

    有趣的答案。我想知道它是否通過@ deceze的有效答案過濾器。 –

    +0

    @Buttle事實上,它的確如此,因爲它的前提是1)它在定義上很難,2)它不會*替換*字。這是否是我不知道的解決方案,但答案很好。事實上,一個upvote是我的。 – deceze

    +0

    WDYL現在404s,所以這是行不通的。 – Michael

    相關問題