斯威夫特:如何审查/过滤为咒骂词等输入的文字?

时间:2016-07-04 13:26:04

标签: ios swift

我只想知道是否有确定的方法来做到这一点,或者如何做到这一点。

我有一个文本字段,基本上可以作为我的iOs应用中的表单,用户可以在其中发布内容。我无法让用户发布脏话/不合适的垃圾,所以如果他们输入的字符串包含其中一个字,我想过滤掉并显示错误。

Swift中的其他应用程序如何做到这一点?他们只是搜索字符串以查看它是否包含单词(显然不是其他单词,而是单独站立)或者是否有另一种方法?

如何在Swift中准确过滤掉用户帖子中的脏话?

5 个答案:

答案 0 :(得分:3)

构建您认为是发誓单词的单词列表,只需检查用户输入的字符串是否包含在字符串中的任何单词。

斯威夫特3:

import Foundation

func containsSwearWord(text: String, swearWords: [String]) -> Bool {
    return swearWords
        .reduce(false) { $0 || text.contains($1.lowercased()) }
}

// example usage
let listOfSwearWords = ["darn", "crap", "newb"] 
    /* list as lower case */

let userEnteredText1 = "This darn didelo thread is a no no."
let userEnteredText2 = "This fine didelo thread is a go."

print(containsSwearWord(text: userEnteredText1, swearWords: listOfSwearWords)) // true
print(containsSwearWord(text: userEnteredText2, swearWords: listOfSwearWords)) // false

Swift 2.2:

import Foundation

func containsSwearWord(text: String, swearWords: [String]) -> Bool {
    return swearWords
        .reduce(false) { $0 || text.containsString($1.lowercaseString) }
}

// example usage
let listOfSwearWords = ["darn", "crap", "newb"]
/* list as lower case */

let userEnteredText1 = "This darn didelo thread is a no no."
let userEnteredText2 = "This fine didelo thread is a go."

print(containsSwearWord(userEnteredText1, swearWords: listOfSwearWords)) // true
print(containsSwearWord(userEnteredText2, swearWords: listOfSwearWords)) // false

答案 1 :(得分:2)

我创建了一个类,使您可以输入字符串并删除亵渎语言。 Here's a link to the repo

以下是代码:

class ProfanityFilter: NSObject {

    static let sharedInstance = ProfanityFilter()
    private override init() {}

    // Customize as needed
    private let dirtyWords = "\\b(ducker|mother ducker|motherducker|shot|bad word|another bad word|)\\b"

    // Courtesy of Martin R
    // https://stackoverflow.com/users/1187415/martin-r
    private func matches(for regex: String, in text: String) -> [String] {

        do {
            let regex = try NSRegularExpression(pattern: regex, options: [.caseInsensitive])
            let nsString = text as NSString
            let results = regex.matches(in: text, range: NSRange(location: 0, length: nsString.length))
            return results.map { nsString.substring(with: $0.range)}
        } catch let error {
            print("invalid regex: \(error.localizedDescription)")
            return []
        }
    }

    public func cleanUp(_ string: String) -> String {
        let dirtyWords = matches(for: self.dirtyWords, in: string)

        if dirtyWords.count == 0 {
            return string
        } else {
            var newString = string

            dirtyWords.forEach({ dirtyWord in
                let newWord = String(repeating: "", count: dirtyWord.characters.count)
                newString = newString.replacingOccurrences(of: dirtyWord, with: newWord, options: [.caseInsensitive])
            })

            return newString
        }
    }
}

用法:

 yourLabel.text = ProfanityFilter.sharedInstance.cleanUp(yourString)

答案 2 :(得分:1)

如果此方法返回范围,

str.range(of: "darn|crap|newb", options: [.regularExpressionSearch, .caseInsensitiveSearch], range: str.startIndex..<str.endIndex, locale:nil)

发现了一个令人反感的词。虽然此方法可用于删除违规字符串:

str.replacingOccurrences(of: "darn|crap|newb", with: "", options: [.regularExpressionSearch, .caseInsensitiveSearch])

答案 3 :(得分:0)

我建议您查看API,然后您可以提交字符串并获取包含以下信息的JSON响应:

  • 字符串坏了吗?
  • 字符串
  • 中包含的错误字总数
  • 包含所有已识别的错误字词的数组
  • 输入字符串的删失版本

我通过Google找到了一些消息来源。检查这些并进行更多研究,以确定API是否最适合您以及您应该使用哪一个。 我认为使用API就像我下面列出的那样是最实用的方法,因为你 NOT 必须编译一个列表“糟糕的“自己说话,并使用设备中的资源对列表进行排序(可能包含数千个单词)。

相反,您可以使用API简单地提交字符串,以便从API服务器获取包含JSON格式数据的网络响应

为什么不让API服务器为您做逻辑并只是吐出答案?

NeutrinoAPI

答案 4 :(得分:-1)

扩展检查粗言秽语。

Swift 4.2

示例用法:

"poop".containsBadWord()

扩展名:

extension String {

    func containsBadWord()->Bool {
        //Sorry for bad words
        let badWords = ["insert","bad","words","here","poop"]
        for word in badWords {
            if lowercased().contains(word) {
                return true
            }
        }
        return false
    }

}