Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift:如何审查/过滤为脏话等输入的文本?_Ios_Swift - Fatal编程技术网

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
循环方法更快