1

I'm developing a website using codeigniter that allows users to post free ads and search for ads, I'm looking for a fast way to check the user input against a list of offensive words stored in database table, so that if a user enters a bad word, one from those listed in that table then it should be removed (not entered). my table is using the MySql fulltext search feature.

I tried using the like in sql but I was told that it gets slow when the records reach thousands.

is there any suitable solution in codeigniter ?

4

1 回答 1

1

有很多方法可以做到这一点。在您的情况下,我什至不会使用 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);
?>

这可能是目前最快的解决方案之一,它易于实施且速度非常快。如果你想让它更快,你甚至可以缓存从数据库中获取的正则表达式,使用数据库缓存。

如果您有兴趣更快地做到这一点(您真的不需要),我会编写一个数据库触发器/约束,只要应该插入“广告”,就会在数据库中执行此正则表达式匹配。

于 2012-06-23T00:36:28.863 回答