Ios Swift:如何审查/过滤为脏话等输入的文本?
我只是想看看是否有一个既定的方法来做这件事,或者人们会如何做 我有一个文本字段,它在我的iOs应用程序中充当一个表单,用户可以在其中发布一些内容。我不能让用户发布脏话/不恰当的废话,所以如果他们输入的字符串包含这些单词中的一个,我想过滤掉并显示一个错误 Swift中的其他应用程序如何做到这一点?他们只是在字符串中搜索,看看它是否包含单词(显然不是在其他单词中,而是独立的),还是有其他方法Ios Swift:如何审查/过滤为脏话等输入的文本?,ios,swift,Ios,Swift,我只是想看看是否有一个既定的方法来做这件事,或者人们会如何做 我有一个文本字段,它在我的iOs应用程序中充当一个表单,用户可以在其中发布一些内容。我不能让用户发布脏话/不恰当的废话,所以如果他们输入的字符串包含这些单词中的一个,我想过滤掉并显示一个错误 Swift中的其他应用程序如何做到这一点?他们只是在字符串中搜索,看看它是否包含单词(显然不是在其他单词中,而是独立的),还是有其他方法 中准确地过滤出我的用户帖子中的脏话,构造一个你认为是咒骂的单词的列表,并简单地检查用户输入的字符串是否包含在
<如何在SWIFT? < P>中准确地过滤出我的用户帖子中的脏话,构造一个你认为是咒骂的单词的列表,并简单地检查用户输入的字符串是否包含在字符串中。 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
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
Swift 2.2:
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
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
我建议查看
API
,您可以向其提交字符串并获得JSON
响应,其中包含以下信息:
- 绳子坏了吗
- 字符串中包含的坏字总数#
- 包含所有已识别的坏字的数组
- 输入字符串的删失版本
API
是否最适合您,以及您应该使用哪一种我认为使用API
是最实际的方法,就像我在下面列出的方法一样,因为不是你必须自己编译一个“坏”字列表,并使用设备的资源对列表进行排序(可以包含数千个字)
相反,您可以使用API
提交一个字符串,从API
服务器获取包含JSON格式数据的网络响应
为什么不让API服务器为您执行逻辑并给出一个答案呢
如果此方法返回一个范围
str.range(of: "darn|crap|newb", options: [.regularExpressionSearch, .caseInsensitiveSearch], range: str.startIndex..<str.endIndex, locale:nil)
我创建了一个类,使您能够输入字符串并删除亵渎 代码如下:
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: "Extension checking for foul language.
Swift 4.2
Example Usage:
"poop".containsBadWord()
类亵渎过滤器:NSObject{
静态let sharedInstance=亵渎过滤器()
私有重写init(){}
//根据需要定制
private let dirtyWords=“\\b(ducker |妈妈ducker |妈妈ducker | shot |坏词|另一个坏词|)\\b”
//马丁R.提供
// https://stackoverflow.com/users/1187415/martin-r
private func匹配(对于regex:String,在text:String中)->[String]{
做{
让regex=尝试NSRegularExpression(模式:regex,选项:[.case不敏感])
设nsString=文本为nsString
让results=regex.matches(in:text,range:NSRange(位置:0,长度:nsString.length))
返回results.map{nsString.substring(带$0.range)}
}捕捉错误{
打印(“无效的正则表达式:\(错误.localizedDescription)”)
返回[]
}
}
公共函数清理(u-string:string)->string{
让dirtyWords=匹配(for:self.dirtyWords,in:string)
如果dirtyWords.count==0{
返回字符串
}否则{
var newString=string
forEach({dirtyWord in
让newWord=String(重复:“扩展名检查脏话
Swift 4.2
用法示例:
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
}
}
分机:
制作一个数组并检查字段输入的文本是否在数组中。或者可能存在这些单词的某种数据库,以便您可以使用。IRL使用reduce
和包含一长串单词(在各种情况下,例如crap、crap、crap*p等)这将是低效的,因为它可以在整个数组中运行,并且在找到第一个实例后不会停止。在键入文本时执行此操作肯定不起作用,甚至在按下提交按钮后也不太好。您通常只在用户尝试转义键盘时调用上述方法,或者如您所说,在t提交。此外,Swift速度快,并且使用。小写字母
比较(应用于文本
并以小写字母保留列表)是一个自然的选择,而不是包括大小写变化。最后,Swift编译器虽然年轻,但相当聪明,而且由于|
是惰性实现的,我假设使用上面的reduce允许短路。不过,我需要稍后测试这个理论。不过,如果坏词的列表越来越大。是的,你可以在一篇短文中降低字符串的大小写以解决部分问题。我支持reduce的问题,但你可能会遇到太多不必要的调用,如果你将脏话从最常见的到最不常见的排序,那么返回true的情况会很快发生。我不想说你会这么做gex没有自己的性能问题,因为我相信其他人会指出这些问题,但内置方法可能会更好地优化搜索。@我刚刚测试的sketchyTech(确保在实际项目中测试,而不是在游乐场中测试)和reduce
,如上所述的评估允许短路;即,在第一次击中(true
)之后它终止了。我猜编译器会将上面的reduce
简化为类似于您为编辑建议的手动for
循环(感谢编辑建议!但我会保留reduce
解决方案,因为它的结果与此评论中描述的结果相同)。(…还请注意,如上所述,Swift非常快:对于10000
个坏单词的列表,对于给定的~500
个字符的文本,最坏的情况是(搜索完整列表而不点击一次/提前退出)在iPhone 6上执行~0.1s
。纯for
循环方法更快