[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Поясните причину
andrey888
Доброго времени суток этому форуму еще раз , и всем поясняющим ) .
Понадобилось решить задачу с нахождением так называемых "плохих слов" в комментариях .
Список слов берется из БД , далее идет примерно следующая проверка

//берем комент
$comment=mysql_real_escape_string(htmlspecialchars(trim($_POST["comment"])));
//создаем массив $badwords из строки $bad
$badwords=explode(',',$bad);
//убираем все кроме букв (в регулярках опыт небольшой)
$comment = preg_replace ("/[^a-zа-я\s]/ui","",(string)strtolower($comment));
//ищим слова в строке комментария
for($i=0;$i<count($badwords);$i++){
if(strpos($comment,$badwords[$i])!==false || strpos($comment,$badwords[$i])!=="" || strpos($comment,$badwords[$i])!==0){
//если нашли ,как пример отправляем гуглить
header('location:http://www.google.com/');
unset($comment);
unset($badwords);
die();
}
}



Описание проблемы :
Если мы через админку занесли в БД "плохие слова" такое слово как FUCK и коментирующий напишет его - его коментарий будет отсеян , непринят и он пойдет (исходя из примера) Гуглить. Захочет коментирующий написать что то типа F*-U-C+K in g - так же будет отправлен на гугл . А вот со словом типа F*uC & -King - Проблема .
Дело в том что на локалке - такое тоже отсеивается , а вот на реальном сервере последнее выражение успешно пройдет .
Как сказал в регулярке опыт небольшой - может там где накуролесил , но тогда бы и на локале такое слово проходило .
В чем причина такой непонятки ?
Спасибо за содействие .





Спустя 32 минуты, 35 секунд (31.07.2011 - 14:55) Invis1ble написал(а):
mysql_real_escape_string(htmlspecialchars( - изза этого, прочти назначение этих функций, прежде чем их применять.
Также, регулярку можно упростить:
"/[^\pL\pZ]/u" (тут кстати модификатор i ненужен, ты ведь юзаешь strtolower())

Спустя 8 часов, 7 минут, 48 секунд (31.07.2011 - 23:02) andrey888 написал(а):
Ох едрить налево - спасибо - .. Просто эту строку взял из второй функции где после проверки капчи данные заносятся в БД .. Что ж - Бывает, когда целый день перед экраном - залипаешь и не видишь самого простого ..
Насчет регулярки приведенной в пример ("/[^\pL\pZ]/u") вопрос - она убирает все символы кроме букв ?
И еще вопрос раз уж об этом .. Что будет работать быстрее регулярка или что то типо
str_replace(array(' ','-','_',и т.д),'',(string)strtolower($comment));
?
Благодарю .

Спустя 3 часа, 10 минут, 57 секунд (1.08.2011 - 02:13) Invis1ble написал(а):
Цитата
она убирает все символы кроме букв

кроме букв и пробелов (также как в твоей версии), кстати, насчет пробелов я так и не понял прикола
Цитата
Что будет работать быстрее регулярка или что то типо

скорее всего str_replace(), но не факт. нужно тестировать

Спустя 19 часов, 11 минут, 2 секунды (1.08.2011 - 21:24) andrey888 написал(а):
А как пробелы убрать ? ..
Что тут непонятного , придет "негодяй" писанет "F U C K" и это пройдет .

Спустя 13 минут, 3 секунды (1.08.2011 - 21:38) Invis1ble написал(а):
andrey888
Цитата
Что тут непонятного , придет "негодяй" писанет "F U C K" и это пройдет .

В том то и дело, или у тебя в БД лежат все "плохие" слова со всеми возможными комбинациями с пробелами?
Цитата
А как пробелы убрать ? ..

\pZ

Спустя 10 минут, 27 секунд (1.08.2011 - 21:48) andrey888 написал(а):
мля что- то странное .. работало это все один день .. как надо .. сегодня стал повторно проверять - не проходит ни один комент , даже без мата ) .. причина оказалась вот в этой проверке
if(strpos($comment,$badwords[$i])!==false || strpos($comment,$badwords[$i])!=="" || strpos($comment,$badwords[$i])!==0)

убрал из этого все окромя первого - работает как надо .. При этом в мануале черным по белому (и красным по желтому) прописано что функция может возвращать как FALSE так и его логические эквиваленты 0 и "" ..
Вообщем куралесица какая то , то работает так, то по другому . Может есть замена этой функции которая возвращает не одно и два "возможных" значения , а одно ?

Спустя 5 минут, 18 секунд (1.08.2011 - 21:53) Invis1ble написал(а):
if (!strstr($comment, $badwords[$i]))

Спустя 2 минуты, 8 секунд (1.08.2011 - 21:55) andrey888 написал(а):
Цитата (Invis1ble @ 1.08.2011 - 18:38)
andrey888
Цитата
Что тут непонятного , придет "негодяй" писанет "F U C K" и это пройдет .

В том то и дело, или у тебя в БД лежат все "плохие" слова со всеми возможными комбинациями с пробелами?
Цитата
А как пробелы убрать ? ..

\pZ

Нет зачем . в бд лежат слова через запятую .. в проверке на плохие слова выносим все эти слова в одну большую строку , делаем эксплод (через запятую) - поучаем массив . А вот теперь чтоб сравнить мне и нужно все кроме букв из коментария убрать - и если будет попадание по одному из компонентов массива - дальше комент не пройдет ...

Спустя 1 минута, 40 секунд (1.08.2011 - 21:57) Invis1ble написал(а):
andrey888
Цитата
нужно все кроме букв из коментария убрать

ну дык а я тебе о чем, а у тебя регулярка пробелы пропускает

Спустя 11 минут, 55 секунд (1.08.2011 - 22:09) andrey888 написал(а):
немного почитал и все таки использую
$comment=str_replace(array(' ','-','_','*','^','@','>','<','?','&','$','#','|','=','+','%'),'',(string)strtolower($comment));

- знаю что символы не все.
за strstr() спасибо . хоть она чуть медленнее - она возвращает только одно значение . Благодарю ;)


_____________
Прогноз на следующие 5 лет : Россия, Китай - две величайшие державы.
США в Ж*пе. Справедливость восторжествует. )
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.