我正在使用 codeigniter 开发一个允许用户发布免费广告和搜索广告的网站,我正在寻找一种快速的方法来检查用户输入是否与存储在数据库表中的冒犯性单词列表相对应,这样如果用户输入了一个坏词,一个来自该表中列出的词,然后应该将其删除(不输入)。我的表正在使用 MySql 全文搜索功能。
我尝试在 sql 中使用 like,但我被告知当记录达到数千时它会变慢。
在 codeigniter 中有没有合适的解决方案?
最佳答案
有很多方法可以做到这一点。在你的情况下,我什至不会使用 SQL,我只会在 CI 中编写一个配置选项,并为所有坏词使用正则表达式,然后将你的输入与那些坏词进行匹配。例如
$config['bad_words'] = "/[\s](ass|sex|butt|badword)[\s]/i";
$input = preg_replace($config['bad_words'],"",$input);
如果您有数以千计的记录,这会起作用,但如果有数以千计的坏词,这可能会有点慢。当然,如果您要使用的坏词不止几个,则正则表达式不是一个好主意。如果你有成千上万的坏词,我会在 mysql 中使用“like”。它确实有点慢,但对性能的影响并不大。
使用 SQL,我会创建一个坏词数据库(或坏词 regex-es)。 bad_words 表的每一行都会有一个正则表达式来匹配一个坏词,例如“fu.k”。在验证输入以过滤掉不良词时,您需要:
<?php
$res = mysql_query( "select * from bad_words" );
...
//get all rows in array $badWords
...
$myRegexMatch = implode ( "|" , $badWords );
preg_replace($myRegexMatch,"",$input);
?>
这可能是目前最快的解决方案之一,它易于实现且速度非常快。如果你想让它更快,你甚至可以缓存从数据库中获取的正则表达式,使用数据库缓存。
如果您有兴趣更快地完成它(您确实不需要),我会编写一个数据库触发器/约束,在应该插入“广告”时在数据库中执行此正则表达式匹配。
关于mysql - 如何使用数据库防止在 codeigniter 中插入某些冒犯性词语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11165466/