Select
Новичок
PHP:
<?php
if (file_exists("blocks/bd.php")) { require_once("blocks/bd.php"); }
function dropBackWords($word) { //тут мы обрабатываем одно слово
$reg = "/(ый|ой|ая|ое|ые|ому|а|о|у|е|ого|ему|и|ство|ых|ох|ия|ий|ь|я|он|ют|ат)$/i"; //данная регулярная функциях будет искать совпадения окончаний
[B]$word = preg_replace($reg,'',$word);[/B] //убиваем окончания
return $word;
}
function stopWords($query) { //тут мы обрабатываем весь поисковый запрос
$reg = "/\s(под|много|что|когда|где|или|которые|поэтому|все|будем|как)\s/gim"; //данная регулярка отрежет все стоп-слова отбитые пробелами
[B] $query = preg_replace($reg,'',$query);[/B] //убиваем стоп-слова
return $query;
}
function explodeQuery($query) { //функция вызова поисковой строки
$query = stopWords($query); //используем написанную нами ранее функцию для удаления стоп-слов
$words = explode(" ",$query); //разбиваем поисковый запрос на слова через пробел и заносим все слова в массив
$i = 0; //устанавливаем начало массива в 0, помним что нумерация в массивах начинается с 0
$keywords = ""; //создаем пустой массив
foreach ($words as $word) { //в цикле для массива words создаем элемент word
$word = trim($word);
if (strlen($word)<6) { //если слово короче 6 символов то убиваем его
unset($word);
}
else { //иначе выполняем следующее
if (strlen($word)>8) {
$keywords[$i]=dropBackWords($word); //наша функция чистки окончаний для слов длинее 8 символов и занесение их в созданный нами массив
$i++; //наращиваем значение i для того чтобы перейти к следующему элементу
}
else {
$keywords[$i]=$word; //если короче 8 символов то просто добавляем в массив
$i++;
}
}
}
return $keywords; //возвращаем полученный массив
}
function colorSearchWord($word, $string, $color) {
$replacement = "<span style='color:".$color."; border-bottom:1px dashed ".$color.";'>".$word."</span>";
$result = str_replace($word, $replacement, $string);
return $result;
}
function searchResult($materials, $keywords) {
foreach ($materials as $material) { //Выше мы сформировали массив $materials который мы теперь выводим разбивая на элементы массива $material
$title = htmlspecialchars(strip_tags($material[title])); //Тут мы чистим все значения массива - title, text и keywords от тегов и посторонних символов
$text = htmlspecialchars(strip_tags($material[text])); //как вариант можно еще все слова перевести в нижний регистр
$key = htmlspecialchars(strip_tags($material[keywords]));
$wordWeight =0; //вес слова запроса приравниваем к 0
foreach ($keywords as $word) { //теперь для каждого поискового слова из запроса ищем совпадения в тексте
$reg = "/(".$word.")/"; //маска поиска для регулярной функции
/*
Автоматически наращиваем вес слова для каждого элемента массива.
Так же сюда можно включить например поле description если оно у вас есть.
Оставляем переменную $out, которая выводит значение поиска. Она нам может и не пригодится, но пусть будет, может быть вы найдете ей применение.
*/
$wordWeight = preg_match_all($reg, $title, $out); //как вариант можно еще для слов в заголовке вес увеличивать в два раза
$wordWeight += preg_match_all($reg, $text, $out); //но это вам понадобиться если вы будете выводить материалы в порядке убывания по релевантности
$wordWeight += preg_match_all($reg, $key, $out); //мы же пока этого делать не будем
$material[relevation] += $wordWeight; //увеличиваем вес всего материала на вес поискового слова
//раскрашиваем найденные слова функцией, которую мы писали в первой части урока
$title = colorSearchWord($word, $title, "violet");
$text = colorSearchWord($word, $text, "violet");
$key = colorSearchWord($word, $key, "violet"); //незнаю зачем ключевые слова окрасил, их ведь не обязательно выводить пользователю :)
}
//Теперь ищем те материалы, у которых временный атрибут relevation не равен 0
if($material[relevation]!=0) {
//Возвращаем массивы в нормальное состояние с уже обработанными данными
$material[title] = $title;
$material[text] = $text;
$material[keywords] = $key;
echo "результат:"; simpleToTamplate($material, "search_result"); //новая функция, которая вернет нам шаблон с результатами поиска
}
//Иначе просто грохаем весь элемент material за ненадобностью
else {
unset($material);
}
}
}
if(isset($_REQUEST["search_word"])) {
$query = trim($_REQUEST["search_word"]); //делаем небольшую чистку, можете добавить еще защиту от различных инъекций и подозрительных переменных, которые могут ввести вам вредные пользователи
print_r($keywords = explodeQuery($query)); //тут наша функция с первой части урока
$sql = "SELECT id,title,text,description FROM pages "; //ищем только опубликованные материалы
$result = mysql_query($sql);
if ($mysql_num_rows($result)!=0) { //проверяем наличие записей, если нет, то естественно ничего не выведем и прекратим любую работу системы
while($row = mysql_fetch_assoc($result))
{
$materials[$row[id]] = $row; //Формируем массив $materials с найденными материалами
}
searchResult($materials,$keywords); //выводим наш результат поиска, функцию мы рассмотрим ниже
}
else {
echo "напишем тут какую-нибудь ошибку для пользователя";
}
}
function simpleToTamplate($value, $tamplate) {
echo $value;
echo $tamplate;
/* ob_start(); // Включаем буферизацию вывода, чтобы шаблон не вывелся в месте вызова функции
// Подключаем необходимый нам шаблон, который просто ждет наш массив
include('tamplates/'.$tamplate.'.tpl');
return ob_get_clean(); //Возвращаем результат буфера и очищаем его */
}
?>
Для полного представления выложил весь код, который есть
Здесь имеется поиск из БД... Вот тут есть разжеванный код всего этого
http://ruseller.com/project.php?id=2
Помогите понять почему не работает preg_replace, выделил жирным то самое место