斯威夫特:如何审查/过滤文字input的文字等?

我只是想看看是否有一个既定的方法来做到这一点,或者如何去做这件事。

我有一个文本字段,本质上充当我的iOs应用程序中的一个用户可以发表的东西的forms。 我不能让用户张贴发誓的话/不适当的废话,所以我想过滤掉,并显示错误,如果他们input的string包含这些单词之一。

Swift中的其他应用程序如何做到这一点? 他们只是通过stringsearch,看看它是否包含这个词(显然不是在其他的词,但独自站立),还是有另一种方法?

我怎样才能准确地过滤掉我的用户在Swift中的发言?

构build一个你认为是发誓的单词的列表,只要检查用户input的string是否有任何这些单词包含在string中。

Swift 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 

如果这个方法返回一个范围,

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

一个冒犯性的词已被发现。 虽然这种方法可以用来删除有问题的string:

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

我build议寻找一个API ,你可以提交一个string,并得到一个JSON响应包含的信息,如:

  • string不好?
  • string中包含的坏词的总数
  • 包含所有已识别的不良词的数组
  • inputstring的审查版本

我通过Googlefind了一些资源。 检查出来,做一些更多的研究,以find一个API是最适合你,你应该使用哪一个。 我假设使用像下面列出的API是最实际的方法 ,因为您不必自己编译“坏”字的列表,并使用设备中的资源对列表进行sorting(可以包含数千个单词)。

相反,您只需使用API提交一个string即可API服务器获取包含JSON格式数据的networking响应

为什么不让API服务器为你做逻辑,只是吐出一个答案?


NeutrinoAPI

我创build了一个类,使您能够提供一个string,并消除亵渎。 这是一个回购的链接 。

代码如下:

 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)