我只想知道是否有确定的方法来做到这一点,或者如何做到这一点。
我有一个文本字段,基本上可以作为我的iOs应用中的表单,用户可以在其中发布内容。我无法让用户发布脏话/不合适的垃圾,所以如果他们输入的字符串包含其中一个字,我想过滤掉并显示错误。
Swift中的其他应用程序如何做到这一点?他们只是搜索字符串以查看它是否包含单词(显然不是其他单词,而是单独站立)或者是否有另一种方法?
如何在Swift中准确过滤掉用户帖子中的脏话?
答案 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服务器为您做逻辑并只是吐出答案?
答案 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
}
}