Ben*_*oop 200 php regex multilingual user-input
我们中的许多人需要处理用户输入,搜索查询以及输入文本可能包含亵渎语言或不良语言的情况.通常需要将其过滤掉.
哪里可以找到各种语言和方言的咒骂词?
是否有可用于包含良好列表的源的API?或者也许一个API只是简单地说"是的这是干净的"或"没有这是脏的"一些参数?
有什么好方法可以让人们试图欺骗系统,比如$$,azz或a55?
如果您提供PHP解决方案,则可获得奖励积分.:)
例如,我认为这种过滤器有一个位置,例如,用户可以使用公共图像搜索来查找添加到敏感社区池的图片.如果他们可以搜索"阴茎",那么他们很可能会得到许多照片,是的.如果我们不想要那些图片,那么防止这个词作为搜索词是一个很好的看门人,尽管不可否认这不是一个万无一失的方法.首先获取单词列表是真正的问题.
所以我真的指的是一种方法来弄清楚单个令牌是否脏,然后简单地禁止它.我不打算像完全搞笑的"长颈长颈鹿"参考那样阻止一种情绪.你无能为力.:)
Han*_*nto 174
此外,人们不能忘记Toontown的SpeedChat的不为人知的历史,甚至使用"安全词白名单"导致一个14岁的孩子迅速绕开它: "我想把我的长颈长颈鹿贴在蓬松的白色兔子身上".
结论:最终,对于您实施的任何系统,绝对没有人类评论的替代品(无论是同行还是其他).随意实现一个基本工具来摆脱驱动器,但对于确定的巨魔,你绝对必须有一个非基于算法的方法.
一个删除匿名并引入问责制的系统(Stack Overflow做得很好)也很有帮助,特别是为了帮助对抗John Gabriel的GIFT
您还询问了哪些地方可以获得亵渎列表以帮助您入门 - 一个要检查的开源项目是Dansguardian - 查看其默认亵渎列表的源代码.还有一个额外的第三方短语列表,您可以下载代理,这可能是一个有用的收集点.
编辑以回答问题编辑:感谢您澄清您正在尝试做什么.在这种情况下,如果您只是尝试做一个简单的文字过滤器,有两种方法可以做到.一种是创建一个单一的长正则表达式,其中包含您要审查的所有禁用短语,并且仅使用它进行正则表达式查找/替换.像这样的正则表达式:
$filterRegex = "(boogers|snot|poop|shucks|argh)"
Run Code Online (Sandbox Code Playgroud)
并使用preg_match()在输入字符串上运行它以批量测试命中,
或者preg_replace()将它们清空.
您还可以使用数组而不是单个长正则表达式加载这些函数,对于长单词列表,它可能更易于管理.有关如何灵活使用数组的一些好例子,请参阅preg_replace().
有关其他PHP编程示例,请参阅此页面,了解一个有点高级的字过滤通用类,它是*来自删失字的中心字母,以及之前的Stack Overflow问题,它也有一个PHP示例(其中主要的有价值的部分是基于SQL的过滤词方法 - 如果您认为没有必要,可以省去leet-speak补偿器.
你还补充说:"首先获取单词列表是真正的问题. " - 除了之前的一些Dansgaurdian链接,你可能会发现这个方便的.zip 458字有用.
nic*_*har 41
虽然我知道这个问题相当陈旧,但这是一个常见问题......
亵渎过滤器既有原因也有明显的需要(参见维基百科条目),但由于非常不同的原因,它们往往达不到100%的准确性; 背景和准确性.
它(完全)取决于你想要实现的目标 - 在最基本的情况下,你可能试图覆盖" 七个脏话 "然后一些......一些企业需要过滤最基本的亵渎:基本发誓的话,URL甚至个人信息等,但其他人需要防止非法帐户命名(Xbox live就是一个例子)或更多...
用户生成的内容不仅包含潜在的脏话,还可能包含令人反感的引用:
可能还有多种语言.迄今为止,Shutterstock已经开发了10种语言的基本脏词列表,但它仍然是基本的,并且非常注重其"标记"需求.网上还有许多其他列表.
我同意接受的答案,这不是一个科学的定义和为语言是一个不断发展的挑战,但在其中一种90%的拦截率优于0%.这完全取决于你的目标 - 你想要达到的目标,你所拥有的支持程度以及删除不同类型亵渎的重要性.
在构建过滤器时,您需要考虑以下元素以及它们与项目的关系:
你可以轻松地建立一个亵渎过滤器,捕获90%以上的亵渎,但你永远不会达到100%.这是不可能的.你越接近100%,它就变得越难......过去构建了一个复杂的亵渎引擎,每天处理超过500K的实时消息,我会提供以下建议:
基本过滤器包括:
中等复杂的文件管理器将涉及(除了基本过滤器):
复杂的过滤器将涉及以下许多(除了中等过滤器):
Mat*_*ell 26
我不知道有什么好的图书馆,但无论你做什么,都要确保你犯错误的方向.我处理的系统不允许我使用"mpassell"作为用户名,因为它包含"ass"作为子字符串.这是疏远用户的好方法!
Mat*_*hew 23
在我的面试中,正在采访我的公司CTO试用了我用Java编写的单词/网页游戏.在整个牛津英语词典的单词列表中,第一个出现在猜测的词是什么?
当然,英语中最肮脏的词.
不知何故,我仍然得到了工作机会,但我随后找到了一个亵渎词汇表(与此不同)并编写了一个快速脚本来生成一个没有所有坏词的新词典(甚至不需要查看列表) .
对于您的特定情况,我认为将搜索与真实单词进行比较听起来就像使用单词列表一样.替代样式/标点符号需要更多的工作,但我怀疑用户会经常使用它成为一个问题.
Ste*_*owe 21
亵渎过滤系统永远不会是完美的,即使程序员是自信并且随时了解所有裸体发展
也就是说,任何"顽皮词汇"的列表都可能与其他列表一样好,因为潜在的问题是语言理解,这对于当前的技术来说几乎是难以理解的
所以,唯一可行的解决方案是双重的:
关于你的"欺骗系统"子问题,你可以通过在搜索之前规范化"坏词"列表和用户输入的文本来处理这个问题.例如,使用一系列正则表达式(或者如果PHP有,则使用tr)将[z $ 5]转换为"s",[4 @]转换为"a"等,然后将规范化的"坏词"列表与规范化列表进行比较文本.请注意,规范化可能会导致额外的误报,尽管我现在无法想到任何实际情况.
更大的挑战是提出一些让人们在阻止"阴茎"时引用" 钢笔比剑更强大"的东西.
谨防本地化问题:在一种语言中,什么是脏话可能在另一种语言中是一个完全正常的词.
目前的一个例子是:ebay使用字典方法从反馈中过滤"坏词".如果您尝试输入"这是一个完美的交易"("das war eine perfekte Transaktion")的德语翻译,ebay将拒绝由于不良词汇的反馈.
为什么?因为"是"的德语单词是"战争",而"战争"是在"坏词"的ebay词典中.
所以要注意本地化问题.
如果您可以执行类似Digg/Stackoverflow的操作,用户可以在其中投票/标记淫秽内容......请执行此操作.
然后,您需要做的就是检查"顽皮"用户,如果他们违反规则就阻止他们.
我收集了 12 种语言的 2200 个坏词:en、ar、cs、da、de、eo、es、fa、fi、fr、hi、hu、it、ja、ko、nl、no、pl、pt、ru、sv , th, tlh, tr, zh。
MySQL 转储、JSON、XML 或 CSV 选项可用。
https://github.com/turalus/openDB
我建议您将此 SQL 执行到您的数据库中,并在每次用户输入内容时进行检查。