Фильтр стоп-слов для каталогов, досок объявлений и т. д.

Dreammaker
На сайте с 20.04.2006
Offline
570
1947

По мотивам поста в "Веб-строительстве".

Фильтр стоп-слов в виде php-класса.

Описание как пользоваться классом ниже.


<?
(с) Dreammaker, 2007
setlocale(LC_ALL, 'ru_RU.CP1251');
$rules['s'][] = 'плохая фраза или слово 1';
$rules['s'][] = 'плохая фраза или слово 2';

$rules['r'][] = '~(?<=[\s\d\W])слово|^слово~i';
$rules['r'][] = 'плохая фраза или слова 4 в виде регулярного выражения';

class Automod {

var $reg_rules = array();
var $string_rules = array();
var $string ='';

function Automod($config = array())
{
$string= '';
$numargs = func_num_args();

$arg_list = func_get_args();

for ($i=1; $i<$numargs; $i++)
{
$string .= $arg_list[$i] . ' ';
}

$string .= trim($string);

$this->string = $string;

if (isset($config['s']))
{
$this->string_rules = $config['s'];
}

if (isset($config['r']))
{
$this->reg_rules = $config['r'];
}

}


function is_permitted(){

if (!$this->is_reg_permitted() || !$this->is_string_permitted())
return 0;
else
return 1;
}


function is_reg_permitted(){

$return = 1;
foreach ($this->reg_rules as $value) {

if (preg_match($value,$this->string)) {
$return = 0;
}

}

return $return;

}

function is_string_permitted(){

$return = 1;

foreach ($this->string_rules as $value)
{
if (function_exists('stripos')){
if (stripos($this->string, $value) !== FALSE ) {
$return = 0;
}
}
else {
if ($this->my_stripos($this->string, $value) !== FALSE ) {
$return = 0;
}
}
}

return $return;
}

/* следующий код взят из комментариев функции stripos http:/php.net/stripos */
function my_stripos($string,$word){
$retval = false;
for($i=0;$i<=strlen($string);$i++)
{
if (strtolower(substr($string,$i,strlen($word))) == strtolower($word))
{
$retval = true;
}
}
return $retval;
}

}
?>

Данный код сохранить в виде файла automod.php . Советую его сохранять не в папке сайта, а где-нибудь повыше, так проще буде тподключать к нескольким сайтам. Это позволит редактировать правила для всех каталогов, досок и т.д. на этом хостинге (аккаунте).

Подключить файл можно с помощью

include('путь_к_файлу/automod.php') в начале скрипта, в котором происходит добавление в базу новой записи (add.php и так далее).

Правила описываются в начале файла с классом. s-правила - это строковые правила. Они слово или фраза будет искать, так как Вы её написали (единственно, что это будет регистронезависимый поиск, то есть "красная армия" и "КрАсНАя арМия" - это одно и тоже). Просто добавляйте фразы и слова пор аналогии.

Далее видны r-правила - это правила, которые задаются с помощью регулярных выражений. Здесь регистронезависимость нужно задавать уже в самой регулярке.

Подключение класса к каталогу или доске.

Например, у Вас на данный моент запрос добавления в базу новой записи выглядит так:


$sql = "INSERT INTO table (id, cell1, cell2, cell3, cell4) VALUES(NULL, $value1, $value2, $value3, $value4)";

mysql_query($sql) or die(mysql_error());

тогда данную запись нужно переписать в такой вид:



$rules = $GLOBALS['rules']; /* на случай, если автомод подключается в теле функции */
$permission = new Automod($rules, $value1, $value2, $value3, $value4);

if ($permission->is_permitted()){

$sql = "INSERT INTO table (id, cell1, cell2, cell3, cell4) VALUES(NULL, $value1, $value2, $value3, $value4)";

mysql_query($sql) or die(mysql_error());
}

То есть , при запуске мы прописываем массив $rules и затем через запятую все переменные, которые должны пройти фильтр.

Если все переменные прошли фильтр, то данные в базу добавятся, если нет, то уйдут на деревню дедушке ...

В общем, примерно так. Класс распространяется "как есть".

Данный php-класс представляет собой именно фильтр стоп-слов, а не полноценного автомодератора. Не хочется конкурировать с продуктами, которые уже есть на рынке. По крайней, мере в данный момент :)

p.s. Уже перед отправкой вспомнил, что есть люди и таких много, которые пользуются php4 :) Поэтому эмуляцию stripos() добавил в код уже прямо в форме нового поста на форуме.

p.p.s. К модераторам: как вариант это можно перенести в "Веб-строительство"....

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий