Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Сделать проверку по стоп-словам
 
 автор: julpierto   (11.07.2011 в 15:31)   письмо автору
 
 

Тестирую форум на движке phpbb2
Нужно сделать так, чтобы названия тем фильтровались по вхождению стоп-слов
Нашел скрипт, который получает данные с формы:
// Check subject
        $stopkeys = array ('картошка','марковка','капуста','огурец');     //   пытаюсь реализовать
            if (!empty($subject)) && (strpos($subject, $stopkeys) !=false)    // сравнение с массивом
    {
        $subject = htmlspecialchars(trim($subject));
    }
    else if ($mode == 'newtopic' || ($mode == 'editpost' && $post_data['first_post']))
    {
        $error_msg .= (!empty($error_msg)) ? '<br />' . $lang['Empty_subject'] : $lang['Empty_subject'];
    }


Подскажите пожалста, как лучше сделать сравнение в данном случае?

  Ответить  
 
 автор: Valick   (11.07.2011 в 15:34)   письмо автору
 
   для: julpierto   (11.07.2011 в 15:31)
 

in_array

  Ответить  
 
 автор: julpierto   (11.07.2011 в 15:43)   письмо автору
 
   для: Valick   (11.07.2011 в 15:34)
 

Эта функция как я понимаю, ищет вхождение слова в массив, а мне нужно, чтобы строка (название темы) проверялась на вхождение слова из массива и если результат !false тему можно публиковать

  Ответить  
 
 автор: Valick   (11.07.2011 в 15:51)   письмо автору
 
   для: julpierto   (11.07.2011 в 15:43)
 

проще нанять модератора, потому как вариаций на тему высркрхудожественного мата ой как много, никто не запрещает писать слово через пробелы или еще как нибудь когда начало или конец слова определить при помощи РНР очень-очень сложно

  Ответить  
 
 автор: julpierto   (11.07.2011 в 15:55)   письмо автору
 
   для: Valick   (11.07.2011 в 15:51)
 

я с вами согласен, но в данном узком случае нужно реализовать именно такую проверку

  Ответить  
 
 автор: Valick   (11.07.2011 в 16:13)   письмо автору
 
   для: julpierto   (11.07.2011 в 15:55)
 

я думаю тут можно с substr_count() поиграться

  Ответить  
 
 автор: Valick   (11.07.2011 в 16:22)   письмо автору
 
   для: julpierto   (11.07.2011 в 15:55)
 


foreach($stopkeys as $value){
if(substr_count($subject,$value)>0) echo "приплыли";
}

попробуйте так
___
только при удачном стечении обстоятельств заголовок
"Застрахуй или проиграешь" - не проканает :)

  Ответить  
 
 автор: julpierto   (11.07.2011 в 18:58)   письмо автору
 
   для: Valick   (11.07.2011 в 16:22)
 

Большое спасибо за помощь, Valick!! ваш вариант как раз то, что нужно)
только пока substr_count всегда выдает 0

  Ответить  
 
 автор: julpierto   (11.07.2011 в 19:03)   письмо автору
 
   для: Valick   (11.07.2011 в 16:22)
 

Большое спасибо за помощь, Valick!! ваш вариант как раз то, что нужно)
только пока substr_count всегда выдает 0
 $stopkeys = array ('синий','красный','зеленый','желтый','фиолетовый');
            foreach($stopkeys as $value)
                {
                               $count_keys = substr_count($subject,$value);
                } 
        if ($count_keys !==0) 
    {
        $subject = htmlspecialchars(trim($subject));
    }
    else if ($mode == 'newtopic' || ($mode == 'editpost' && $post_data['first_post']))
    {
        $error_msg .= (!empty($error_msg)) ? '<br />' . $lang['Empty_subject'] : $lang['Empty_subject'];
    }

  Ответить  
 
 автор: Valick   (11.07.2011 в 19:09)   письмо автору
 
   для: julpierto   (11.07.2011 в 19:03)
 


// Проверка предложения на недопустимые слова
$dostup=true;
$subject="Помидор всему голова!!!";
$sub=strtolower($subject);
$stopkeys=array ('картошка','марковка','капуста','огурец');
foreach($stopkeys as $value){ 
    if(substr_count($sub,$value)>0) $dostup=false; 
}
if($dostup) echo $subject;

  Ответить  
 
 автор: julpierto   (11.07.2011 в 19:22)   письмо автору
 
   для: Valick   (11.07.2011 в 19:09)
 

Изначально было так
     if (!empty($subject)) 
    {
        $subject = htmlspecialchars(trim($subject)); // по идее это значит, что $subject строковая переменная
    }

Исправили на
$stopkeys = array ('красный','синий','желтый','зеленый');
            foreach($stopkeys as $value)
                {
                               $count_keys = substr_count($subject,$value);  // и здесь должно идти сравнение
                } 
        if ($count_keys !==0) 
    {
        $subject = htmlspecialchars(trim($subject));
    }

нужно чтобы стоп-слово было в заголовке, но $count_keys = 0 и пишет каждый раз "Вы должны указать заголовок сообщения, когда начинаете новую тему" даже если нужное стоп-слово вводится в форму.
PS я вас наверное совсем задолбал.)

  Ответить  
 
 автор: Valick   (11.07.2011 в 19:28)   письмо автору
 
   для: julpierto   (11.07.2011 в 19:22)
 

вообще строка $subject = htmlspecialchars(trim($subject)); вызывает некоторое подозрение

htmlspecialchars - нужно использовать при выводе в браузер
а я так понимаю $subject будут запихивать в БД
$count_keys и будет ноль кроме случая когда искомое слово последнее в массиве (можете проверить)
я же дал Вам рабочий код :)

  Ответить  
 
 автор: julpierto   (11.07.2011 в 21:56)   письмо автору
 
   для: Valick   (11.07.2011 в 19:28)
 

Ваш код должен работать по идее, но не работает в моем случае.
Друг подсказал такое решение, через регулярные выражения, сценарий срабатывает, не пойму почему ваш вариант не хочет?

if (!empty($subject))
     {   $subject = strtolower($subject);
         if (preg_match('/красный|желтый|зеленый|синий/', $subject)) 
     {  
          $subject = htmlspecialchars(trim($subject)); } else { die("Not Allowed"); }  // может потому что не было концовки?
     }
   

  Ответить  
 
 автор: Valick   (11.07.2011 в 22:18)   письмо автору
 
   для: julpierto   (11.07.2011 в 21:56)
 

может потому что мой вариант Вы так и не попробовали?)

// Check subject
$stopkeys = array ('картошка','марковка','капуста','огурец');
$dostup=true;
$sub=strtolower($subject);
foreach($stopkeys as $value){ 
    if(substr_count($sub,$value)>0) $dostup=false; 
}
if($dostup){
    $subject = htmlspecialchars(trim($subject));
}else if ($mode == 'newtopic' || ($mode == 'editpost' && $post_data['first_post'])){
    $error_msg .= (!empty($error_msg)) ? '<br />' . $lang['Empty_subject'] : $lang['Empty_subject'];
    }

там где можно обходиться без регулярных выражений - нужно обходиться без регулярных выражений ;)

  Ответить  
 
 автор: julpierto   (11.07.2011 в 22:26)   письмо автору
 
   для: Valick   (11.07.2011 в 22:18)
 

Насчет регулярных выражений согласен - попробовал, где-то тут в коде ошибка, сценарий не запускается
foreach($stopkeys as $value){ 
    if(substr_count($sub,$value)>0) $dostup=false; // вот этот момент меня смущает

  Ответить  
 
 автор: Valick   (11.07.2011 в 22:35)   письмо автору
 
   для: julpierto   (11.07.2011 в 22:26)
 

чем это Вас смущает?

  Ответить  
 
 автор: julpierto   (11.07.2011 в 22:38)   письмо автору
 
   для: Valick   (11.07.2011 в 22:35)
 

Сначала мы назначаем переменной значение $dostup=true;
,затем $dostup=false;
,а потом снова используем как true

  Ответить  
 
 автор: Valick   (11.07.2011 в 22:53)   письмо автору
 
   для: julpierto   (11.07.2011 в 22:38)
 

используем только в том случае если проверка на плохие слова не даст результата
если встретим хоть одно слово из массива, то будет false и условие соответственно не выполниться
с этим все чётко :)

  Ответить  
 
 автор: julpierto   (11.07.2011 в 23:15)   письмо автору
 
   для: Valick   (11.07.2011 в 22:53)
 

Valick, у меня проверка не на плохие слова, а наоборот - если стоп-слово присутствует в заголовке темы, она публикуется, тем самым отсеивая не подходящие темы:)
Поймите меня пожалуйста правильно, ваш идея мне нравится и спасибо, что расширяете мой пхп кругозор, давая альтернативные варианты)
Но этот скрипт не работает и хочется понять почему?)

  Ответить  
 
 автор: Valick   (11.07.2011 в 23:17)   письмо автору
 
   для: julpierto   (11.07.2011 в 23:15)
 

тогда поменяйте местами true и false
$dostup=false;
...

if(substr_count($sub,$value)>0) $dostup=true;

___
он работает, просто я сначала не понял условие задачи)

  Ответить  
 
 автор: julpierto   (11.07.2011 в 23:27)   письмо автору
 
   для: Valick   (11.07.2011 в 23:17)
 

Viva La Cuba!!!
Работает) спасибо Valick, что в конце концов "вдолбили" в меня cвою идею и не остановились где-нибудь на пол пути со словами "дерево понимает быстрее")

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования