2010-12-27 32 views
8

Tôi biết có nhiều lý lẽ về lý do tại sao đây là một ý tưởng tồi, nhưng trong quá trình triển khai, tôi đang lên kế hoạch bật/tắt các từ xấu trong cài đặt tài khoản. Nói cách khác, các từ xấu sẽ được hiển thị theo mặc định, nhưng tắt/ẩn nếu được yêu cầu.làm cách nào để tôi có thể thực hiện bộ lọc từ/bộ lọc từ xấu của jQuery?

Kế hoạch sẽ gửi chuỗi JSON cho khách hàng và để khách hàng lọc ra những từ xấu.

chuỗi json

['swear1', 'swear2'] 

gốc cụm từ

this phrase includes swear1 

đầu ra cuối cùng

this phrase includes **** 

đây là những gì tôi đã cố gắng cho đến nay

$(document).ready (function() { 
     $('body').html().replace('asdf', 'ffff'); 
    }); 

bây giờ trên một mặt lưu ý, tôi đang sử dụng asp.net MVC và tôi "có thể" làm điều này ở phía máy chủ, nhưng tôi đã nghĩ rằng điều này sẽ tốt hơn nếu offloaded cho khách hàng ... Tôi đang mở để gợi ý về điều này.

+1

Các JSON-string là không chính xác, 'w' không là duy nhất ... Nó phải là một mảng như thế này:' { "w": [ "thề", "swear2" ]} ' – Harmen

+3

Mã này vẫn có hội chứng clbuttic, phải không? Điều đó có thể không mong muốn ngay cả đối với bộ lọc chọn tham gia –

+0

Bạn không thể. Bộ lọc "Từ xấu" là một ý tưởng sai lầm về cơ bản, và thậm chí các triển khai tốt nhất cũng làm phiền người dùng ít nhất một chục lần với các kết quả sai cho mỗi lần nó thực sự hữu ích. Bất cứ điều gì bạn đến với người dùng làm phiền một trăm lần. Xem thêm: clbuttic. Và không thể ngăn chặn ngay cả một người ngu ngốc, lười biếng từ xúc phạm người khác. Ngoài ra, xác thực phía máy khách có thể dễ dàng bị phá vỡ. – delnan

Trả lời

2

Vì vậy, tôi đã đưa ra đề xuất cơ sở mà @Harmen đã cung cấp và tôi đã mở rộng nó thành một plugin jQuery. Đây có vẻ là triển khai tốt nhất mà tôi có thể nghĩ ra.

jQuery.profanityFilter

$(document).profanityFilter({ 
    replaceWith:'#', 
    customSwears: ['ass'], 
    externalSwears: '/swearWords.json' 
}) 
+0

Xin chào, Làm cách nào để ngăn chặn các từ tiếng Ả Rập xấu? có thể sử dụng profanityFilter không? – weblover

0

Đối tượng JSON bạn trả lại không thể có tên thuộc tính lặp lại. Thay vì { w: 'Swear1', w: 'Swear2' }, nó phải là [ 'Swear1', 'Swear2' ].

Bạn có thể phân tích văn bản để lọc và bao bọc mọi lần xuất hiện của một từ chửi thề giữa các thẻ <span> với thuộc tính lớp cụ thể và chuyển đổi chúng bằng hàm. Đó nên là một cách tiếp cận đơn giản.

+0

xin lỗi, tôi thậm chí còn chưa nhận được JSON, tôi quan tâm nhiều hơn đến chức năng thay thế thực tế. –

+0

Bạn không làm cho JSON trở nên tốt hơn ... – Harmen

+0

@Harmen: thực sự, có. Sử dụng cùng một tên thuộc tính nhiều lần sẽ chỉ trả lại giá trị cuối cùng được gán cho thuộc tính đó. – ncuesta

1

Khi di chuyển mọi thứ từ máy chủ đến ứng dụng khách, bạn luôn phải cân nhắc băng thông so với chi phí xử lý. Chắc chắn, có nó ở phía khách hàng sẽ giảm thiểu bạn xử lý chi phí, nhưng bạn sẽ lãng phí rất nhiều thời gian di chuyển danh sách các từ xấu cho khách hàng.

Ngoài ra, có trên máy chủ có thể cho phép bạn xử lý trước bài đăng, ví dụ: và chỉ cập nhật bài đăng khi thay đổi quy tắc, tiết kiệm nhiều thời gian xử lý hơn.

+0

+1 - vâng tôi đã không thực sự nghĩ về chi phí băng thông với JSON. Đây là một luận điểm hợp lệ –

+1

Nếu bộ nhớ đệm được sử dụng (và rất có thể là), băng thông sẽ chỉ được sử dụng một lần. – brildum

+0

Tôi đã thêm câu trả lời của riêng mình cho câu hỏi rất cũ này. Tôi đã viết một bộ lọc thô tục của jQuery, và trong đó tôi chuyển JSON tới máy khách một lần và nếu có thể, tôi lưu trữ nó trong 'localStorage' –

12

Something như thế này có thể làm việc:

String.prototype.repeat = function(num){ 
    return new Array(num + 1).join(this); 
} 

var filter = ['ass', 'piss']; 

$('.post').text(function(i, txt){ 

    // iterate over all words 
    for(var i=0; i<filter.length; i++){ 

    // Create a regular expression and make it global 
    var pattern = new RegExp('\\b' + filter[i] + '\\b', 'g'); 

    // Create a new string filled with '*' 
    var replacement = '*'.repeat(filter[i].length); 

    txt = txt.replace(pattern, replacement); 
    } 

    // returning txt will set the new text value for the current element 
    return txt; 
}); 

Làm việc example trên jsFiddle

Sửa: ranh giới Added vì vậy nó sẽ không thay thế các từ có chứa chửi thề. Tôi đã sử dụng dấu gạch chéo ngược kép vì dấu gạch chéo ngược phải được thoát trong một chuỗi, see this topic.

+0

hoạt động tốt. Tôi đã phải thực hiện một sửa đổi '$ ('body'). Html' thay vì' $ ('. Post'). Văn bản' bởi vì sử dụng '.text' khiến đầu ra là văn bản thuần và không phải html. –

+0

Làm cách nào để tôi chỉ làm cho toàn bộ bộ lọc regex? IE: ** ass ** cần được lọc nhưng ** không **. Tôi đã thử thêm '^' và '$' vào "mẫu", trong "txt.replace" và cũng trong chuỗi "bộ lọc" JSON ban đầu. Nhưng nó đã không có kết quả. Có lẽ bởi vì nó đang tìm kiếm sự bắt đầu của 'cơ thể' để bắt đầu với" swear1 ", trong đó rõ ràng là không. –

+0

Đối với điều đó bạn sẽ cần các ranh giới như thế này: '\ b ... \ b', tôi sẽ cập nhật câu trả lời của mình;) – Harmen

-1

Bạn sẽ muốn lặp qua tất cả các từ: cho mỗi từ, hãy kiểm tra xem từ của từ đó có bị cấm hay không trước khi thay thế bằng dấu hoa thị.

Để thực hiện điều này một cách hiệu quả, bạn sẽ muốn để lưu trữ các từ trong một Hashtable:

var badWords = { 
    hello: true, 
    goodbye: true, 
}; 

lặp qua mỗi từ và sau đó xem nếu nó là trong hashtable. (Việc giải thích những gì bao gồm một "từ" khác nhau, tùy thuộc vào nếu bạn chỉ tìm kiếm các ký tự được bao quanh bởi khoảng trống hoặc các ký tự không phải alpha khác.)

// Pseudocode 
for each word in content { 
    if (badWords[word]) { 
     // replace word with word.length * characters 
    } 
} 
4

Đây là chức năng nhẹ.

var filterWords = ["fool", "dumb", "shit", "ass", "couch potato"]; 
var rgx = new RegExp(filterWords.join("|"), "gi"); 
function wordFilter(str) {   
    return str.replace(rgx, "****");    
} 
Các vấn đề liên quan