Jump to content
  • 0

Чистка поискового запроса. preg_replace


Torawhite
 Share

Question

Здравствуйте! Подготавливаю поисковый запрос для выборки данных из базы данных оператором LIKE

 

Суть чистки в обрезании окончаний, уничтожению стоп-слов, спец. символов и прочего. Функции-самописки имеют вид:

<?php/*Функция обрезки окончаний слов*/function dropBackWords($word) { //тут мы обрабатываем одно слово$reg = "/(а|я|о|е|ь|и|ы|ая|яя|ое|ее|ый|ать|ять|еть|уть|у|ю|ем|ешь|ете|ет|ут|ют|ал|ял|ала|яла|али|яли|ул|ула|ули)$/i"; //данная регулярная функция будет искать совпадения окончаний$word = preg_replace($reg,'',$word); //убиваем окончанияreturn $word;}/*Функция уничтожения стоп-слов*/function stopWords($query) { //тут мы обрабатываем весь поисковый запрос$reg = "/\s(а|без|более|бы|был|была|были|было|быть|в|вам|вас|весь|во|вот|все|всего|всех|вы|где|да|даже|для|до|его|ее|если|есть|еще|же|за|здесь|и|из|или|им|их|к|как|ко|когда|кто|ли|либо|мне|может|мы|на|надо|наш|не|него|нее|нет|ни|них|но|ну|о|об|однако|он|она|они|оно|от|очень|по|под|при|с|со|так|также|такой|там|те|тем|то|того|тоже|той|только|том|ты|у|уже|хотя|чего|чей|чем|что|чтобы|чье|чья|эта|эти|это|я)\s/gim"; //данная регулярка отрежет все стоп-слова отбитые пробелами$query = preg_replace($reg,'',$query); //убиваем стоп-словаreturn $query;}/*Функция подготовки поискового запроса*/function clearQuery($query) {$query = stripcslashes($query); //удаляем экранирующие бэкслэши$query = htmlspecialchars($query); //преобразуем специальные символы в HTML-сущности$query = stopWords($query); //используем написанную нами ранее функцию для удаления стоп-слов$words = explode(" ",$query); //разбиваем поисковый запрос на слова через пробел и заносим все слова в массив$i = 0; //устанавливаем начало массива в 0, помним что нумерация в массивах начинается с 0$keywords = ""; //создаем пустой массивforeach ($words as $word) { //в цикле для массива words создаем элемент word$word = trim($word);if (empty($word) or strlen($word)<6) { //если слово короче 6 символов или пустое то выводимecho "<div class='search_title_attention'>Поисковый запрос не введён, либо он менее 3-х символов!</div>";}else { //иначе выполняем следующееif (strlen($word)>8) {$keywords[$i]=dropBackWords($word); //наша функция чистки окончаний для слов длинее 8 символов и занесение их в созданный нами массив$i++; //наращиваем значение i для того чтобы перейти к следующему элементу}else {$keywords[$i]=$word; //если короче 8 символов то просто добавляем в массив$i++;}}}return $keywords; //возвращаем полученный массив}?>

Выходит ошибка: Warning: preg_replace() [function.preg-replace]: Unknown modifier 'g' in /home/virtwww/w_torawhite-ru_404794df/http/blocks/functions.php on line 15

 

15-я строка - $query = preg_replace($reg,'',$query); //убиваем стоп-слова

 

Не могу понять в чём ошибка. Помогите, пожалуйста, разобраться с ошибкой.

Link to comment
Share on other sites

4 answers to this question

Recommended Posts

  • 0

У функции preg_replace нет модификатора g. О чем вам и сообщается в тексте ошибки.

Спасибо! Подправил, это была не одна проблема.

Так всё работает, пока...

<?php/*Функция обрезки окончаний слов*/function dropBackWords($word) {$reg = "/(а|я|о|е|ь|и|ы|ая|яя|ое|ее|ый|ать|ять|еть|уть|у|ю|ем|ешь|ете|ет|ут|ют|ал|ял|ала|яла|али|яли|ул|ула|ули)(\s|$)/ui"; //данная регулярная функция будет искать совпадения окончаний$word = preg_replace($reg,'',$word);return $word;}/*Функция уничтожения стоп-слов*/function stopWords($query) { //тут мы обрабатываем весь поисковый запрос$reg = "/(^|\s)(а|без|более|бы|был|была|были|было|быть|в|вам|вас|весь|во|вот|все|всего|всех|вы|где|да|даже|для|до|его|ее|если|есть|еще|же|за|здесь|и|из|или|им|их|к|как|ко|когда|кто|ли|либо|мне|может|мы|на|надо|наш|не|него|нее|нет|ни|них|но|ну|о|об|однако|он|она|они|оно|от|очень|по|под|при|с|со|так|также|такой|там|те|тем|то|того|тоже|той|только|том|ты|у|уже|хотя|чего|чей|чем|что|чтобы|чье|чья|эта|эти|это|я)($|\s)/ui"; //данная регулярка отрежет все стоп-слова отбитые пробелами$query = preg_replace($reg,'',$query);return $query;}/*Функция подготовки поискового запроса*/function clearQuery($query) {$query = stripcslashes($query); $query = htmlspecialchars($query);$words = explode(" ",$query);$words = stopWords($words);$i = 0;$keywords = "";foreach ($words as $word) {$word = trim($word);$regv = '/^([а-я0-9]+)$/i';$count = (preg_match($regv, $word)) ? 6 : 3;if (strlen($word)<$count) {unset($word);}else {if (strlen($word)>8) {$keywords[$i]=dropBackWords($word);$i++;}else {$keywords[$i]=$word;$i++;}}}return $keywords;}?>
Link to comment
Share on other sites

  • 0

У функции preg_replace нет модификатора g. О чем вам и сообщается в тексте ошибки.

Сейчас вторая проблема - не хочет ничего искать!

Например, ввожу в строку поиска - найти то что нужно

 

В обработчике код следующий

$words = clearQuery($query);print_r($words);$sql = 'SELECT * FROM male_articles WHERE title LIKE :words1 OR text LIKE :words2';$data = $pdo->prepare($sql);$data->bindValue(':words1', '%' . $words . '%');$data->bindValue(':words2', '%' . $words . '%');$data->execute();$row = $data->fetch();
print_r($words);

Мне выводит - Array ( [0] => найт [1] => нужн )

То есть функция, описанная выше работает.

Но поиск не даёт результатов!

Если переменной $words присвоить поисковый запрос, то всё ищет!

 

Почему такое может быть?

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy