2012-09-27 108 views
2

我有一個表單,用戶可以在視頻上留言。在人們輸入消息的表單裏面有一個褻瀆過濾器。它工作正常,並捕獲該單詞,如果它在消息中。我的問題是,是否有辦法突出顯示被抓到的單詞,以便用戶看到哪一個被認爲是褻瀆?如何突出顯示C#中的特定單詞?

這裏是正在形成並通過過濾器會消息:

if (context.Request["postform"] == "1") 
    { 
     ProfanityFilter filter = new ProfanityFilter(); 

     // IF NEITHER THE MESSAGE OR FIRSTNAME CONTAINS ANY PROFANITY IN THEM 
     if (filter.containsProfanity(context.Request["message"]) == false && filter.containsProfanity(context.Request["first_name_submitter"]) == false) 
     { 
      videomessage myVideoMessage = new videomessage(); 

      myVideoMessage.video_id = context.Request["video_id"]; 
      myVideoMessage.first_name_submitter = context.Request["first_name_submitter"]; 
      myVideoMessage.last_initial_submitter = context.Request["last_initial_submitter"]; 
      myVideoMessage.message = context.Request["message"]; 
      myVideoMessage.status = "0"; 

      myVideoMessage.Save(); 

      return_success = "1";     
     } 
     else 
     { 
      return_success = "0"; 
      return_errormessage = "<span>Contains profanity</span>"; 
     }     
    } 

這裏是ProfanityFilter類:

public class ProfanityFilter 
{ 
    // *********************************************************************** 
    // CONSTRUCTORS 
    public ProfanityFilter() 
    { 
    } 
    // *********************************************************************** 



    // ************************************************************************ 
    // METHOD: containsProfanity 
    public bool containsProfanity(string checkStr) 
    { 
     bool badwordpresent = false; 

     string[] inStrArray = checkStr.Split(new char[] { ' ' }); 

     string[] words = this.profanityArray(); 

     // LOOP THROUGH WORDS IN MESSAGE 
     for (int x = 0; x < inStrArray.Length; x++) 
     { 
      // LOOP THROUGH PROFANITY WORDS 
      for (int i = 0; i < words.Length; i++) 
      { 
       // IF WORD IS PROFANITY, SET FLAG AND BREAK OUT OF LOOP 
       //if (inStrArray[x].toString().toLowerCase().equals(words[i])) 
       if(inStrArray[x].ToLower() == words[i].ToLower()) 
       { 
        badwordpresent = true; 
        break; 
       } 
      } 
      // IF FLAG IS SET, BREAK OUT OF OUTER LOOP 
      if (badwordpresent == true) break; 
     } 

     return badwordpresent; 
    } 
    // ************************************************************************ 




    // ************************************************************************ 
    // METHOD: profanityArray() 
    // METHOD OF PROFANITY WORDS 
    private string[] profanityArray() 
    { 

     string[] words = { // ARRAY OF WORDS }; 
return words; 
} 
} 

有沒有一種方法來添加一些在else突出字?甚至只是將其顏色從黑色改爲紅色?

預先感謝您!

+2

你還沒有解釋如何向用戶顯示文本 - 就像HTML一樣?在一個網頁?在一個富文本框? – Dai

+0

有人彈出一個表單,讓人們對視頻發表評論。如果評論通過過濾器,評論會自動發送到留言板,否則會顯示錯誤。 – Peter

+0

這很明顯是ASP.NET,不知道彼得是否意識到這一點...... – code4life

回答

8

最直接的方法是用代表該單詞的標記代替所有褻瀆詞的發生,例如,

<span class="profane">PUT_THE_WORD_HERE</span> 

在你的CSS,包括規則

span.profane 

提供某種視覺指示。

既然你應該爭取一個問題的分離,我不會在ProfanityFilter本身做這個標記。一個簡單的方法是讓ProfanityFilter爲它處理的每個字符串片段提供一個事件。這個回調將提供一個指示,說明這個詞是否被認爲是褻瀆,以及片段本身。在事件處理程序中,您可以通過附加每個事件的片段來重新構建原始片段,如果它是褻瀆的,則將其與標記相關聯。該事件還必須接收空白和標點符號,以便可以重新創建完整的原始短語。

短語:

"This website sucks. Really!" 

活動:

"This", profane: false 
" ", profane: false 
"website", profane: false 
" ", profane: false 
"sucks", profane: true 
". ", profane: false 
"Really", profane: false 
"!", profane: false 

如果你不希望立刻得到精心的ProfanityFilter可以返回它的發現褻瀆單詞的列表,你可以做一個全局搜索並替換原始短語。

替換:

public bool containsProfanity(string checkStr) 

public class ProfanityResult 
{ 
    public bool Profane { get; set; } 
    public List<string> ProfanityWords { get; set; } 
} 


public ProfanityResult containsProfanity(string checkStr) 

UPDATE

假設你去的第二個選項,你會做這樣的事情:

string markedMessage = context.Request["message"]; 
if (result.Profane) 
{ 
    foreach (string word in result.ProfanityWords) 
    { 
     markedMessage = markedMessage.Replace(
          word, 
          "<span class=\""profane\"">" + word + "</span>"); 
    }  
} 

這種方法效率不高,因爲它會爲每個替換項創建一個字符串的新副本,但如果您正在進行簡短的評論或發佈,您將不會注意到效率低下。

+0

這樣的東西會如何合併? – Peter

+0

添加了一些解釋。 –

+0

一旦我做了這個改變,我可以在方法中添加一些東西來獲取這個詞嗎? – Peter

1

隨着重構少量,就可以實現這一點,但我會用更好的重構走在Eric J's post

public class ProfanityFilter 
{ 

    public bool containsProfanity(string checkStr, ref List<string> badWords) 
    { 
    // ... 
    if (String.Compare(inStrArray[x], words[i], StringComparison.OrdinalIgnoreCase) == 0) 
    { 
     badwordpresent = true; 
     badWords.Add(inStrArrary[x]);   
    } 
    // ... 
    } 
} 

取而代之的是else塊處理的褻瀆,處理message和先找到first_name_submitter,如果發現褻瀆行爲,請跳出該方法。

List<string> badWords = new List<string>(); 
if (filter.containsProfanity(context.Request["message"], ref badWords)) 
{ 
    return_errormessage = string.Format("<span style=\"color:red\">Message contains the following bad word(s): {0}</span>", 
          HttpUtility.HtmlEncode(String.Join(" ", badWords.ToArray())); 
    return_success = "0"; 
    return; // break out of method 
} 

// save video message 

return_success = "1"; 
3

你可以做這樣的事情:

public string containsProfanity(string checkStr) 
{ 
    // ..... 
    bool badwordpresent = false; 

    // LOOP THROUGH WORDS IN MESSAGE 
    for (int x = 0; x < inStrArray.Length; x++) 
    { 
     // LOOP THROUGH PROFANITY WORDS 
     for (int i = 0; i < words.Length; i++) 
     { 
      if(inStrArray[x].ToLower() == words[i].ToLower()) 
      { 
       inStrArray[x] = "<span class=\"profane\">" + inStrArray[x] + "</span>"; 
       badwordpresent = true; 
       break; 
      } 
     } 
     // if (badwordpresent == true) break; <- removed 
    } 

    return badwordpresent ? String.join(" ", inStrArray) : null; 
} 

編輯:如果沒有發現不好的話,則返回null。

+0

它告訴我,我不能隱式地將類型字符串轉換爲類型布爾? – Peter

+0

因爲該方法返回一個'string',而不是'bool'類型。 –

+1

就像盧克說的那樣,它會返回一個字符串,你可以用壞詞顯示。如果找到了錯誤的單詞,您可能需要添加一個標誌,如果不是,則返回null而不是字符串。另外,你需要在你的css中創建「褻瀆」類 –

相關問題