我正在开发一个使用codeigniter的网站,允许用户发布免费广告和搜索广告,我正在寻找一种快速方法来检查用户输入与存储在数据库表中的令人反感的单词列表,这样如果用户输入一个坏词,一个来自该表中列出的词,然后它应被删除(未输入)。我的表正在使用MySql全文搜索功能。
我尝试在sql中使用like,但有人告诉我,当记录达到数千时,它会变慢。
在codeigniter中有没有合适的解决方案?
答案 0 :(得分:1)
有很多方法可以做到这一点。在你的情况下,我甚至不会使用SQL,我只会在CI中使用正则表达式为所有坏词编写配置选项,然后将输入与那些坏词匹配。 E.g。
$config['bad_words'] = "/[\s](ass|sex|butt|badword)[\s]/i";
$input = preg_replace($config['bad_words'],"",$input);
如果您有数千条记录,这将有效,但数千个不良单词可能会有点慢。当然,如果你想要使用多个坏词,正则表达式是个坏主意。如果你有成千上万的坏话,我会在mysql中使用“like”。它确实有点慢,但对性能的影响不大。
使用SQL,我会创建一个坏词(或坏词正则表达式)的数据库。然后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);
?>
这可能是最快的解决方案之一,它易于实现,而且非常快。如果你想加快速度,你甚至可以使用数据库缓存来缓存从数据库中获取的正则表达式。
如果你对更快(你真的不应该这样做)感兴趣,我会编写一个数据库触发器/约束,只要插入“广告”,就会在数据库中执行此正则表达式匹配。